opencv 遍历图片像素并生成新图片(两种方式对比)

本文介绍了一种高效的图像缩放方法,通过减少图像尺寸来加速后续处理流程。使用OpenCV库中的两种不同方法进行了对比,结果显示使用image.ptr方法比image.at方法效率更高。此外,还展示了如何在缩放后的图像上应用快速角点检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于图片尺寸过大,对图像进行resize处理用到的各种差值方法比较耗费时间,于是手动将图片缩小,每8*8个像素取一个点组成新的图片。

主要考虑两种方式,第一种at方法取图像中的点的用法:image.at<uchar>(i,j):取出灰度图像中i行j列的点;image.at<Vec3b>(i,j)[k]:取出三通道图像中的某一通道对应的值。
第二种(明显较为高效):image.ptr<uchar>(i)。
#include <stdio.h>
#include <opencv.hpp>
#include <cxcore.h>
#include <iostream>

using namespace cv;
using namespace std;

int main(){
    double t = getTickCount();
    Mat src = imread("test.bmp", 0);
    t = double(getTickCount() - t) * 1000 / getTickFrequency();
    cout << "the load src pic time is " << t << "ms" << endl;

    //double t00 = getTickCount();//start
    //int nr = src.rows;
    //int nc = src.cols;
    //Mat img_src(cv::Size(nc / 8, nr / 8), CV_8U);
    //for (int i = 1; i < nr / 8; i++){
    //  for (int j = 1; j < nc / 8; j++){
    //      img_src.at<uchar>(i, j) = src.at<uchar>(8 * i , 8 * j);
    //  }
    //}
    //t00 = double(getTickCount() - t00) * 1000 / getTickFrequency();
    //cout << "the test time=" << t00 << "ms" << endl;//end
    ///*Mat img_src(cv::Size((nc + 1) / 3,(nr + 1) / 3),CV_8U);
    //for (int i=1; i < (nr + 1) / 3; i++){
    //  for (int j=1; j < (nc + 1) / 3; j++){
    //      img_src.at<uchar>(i, j) = src.at<uchar>(3 * i - 1, 3 * j - 1);
    //  }
    //}*/

    double t00 = getTickCount();//start
    int nr = src.rows;
    int nc = src.cols;
    Mat img_src(cv::Size(nc / 8, nr / 8), CV_8U);
    for (int i = 1; i < nr / 8; i++){
        //取出原始图像中8*i行的指针,对应新的图像中的out指针
        const uchar*inData = src.ptr<uchar>(8*i);
        uchar*outData = img_src.ptr<uchar>(i);
        for (int j = 1; j < nc / 8; j++){
            outData[j] = inData[8*j];
        }
    }
    t00 = double(getTickCount() - t00) * 1000 / getTickFrequency();
    cout << "the test time=" << t00 << "ms" << endl;//end

    imshow("the resized img", img_src);

    //fast detect cornors
    //Mat src_copy = src.clone();
    double t_fast = getTickCount();
    vector<cv::KeyPoint>keypoints;
    cv::FastFeatureDetector fast(40, true);
    fast.detect(img_src, keypoints);
    drawKeypoints(img_src, keypoints, img_src, cv::Scalar::all(255), cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);
    t_fast = double(getTickCount() - t_fast) * 1000 / getTickFrequency();
    cout << "the fast detect corners time = " << t_fast << "ms" << endl;
    cout << "the keypoints size=" << keypoints.size() << endl;
    //resize(src, src, cv::Size(0.5*src.cols, 0.5*src.rows));
    imshow("corners", img_src);

    waitKey();
}

第一种image.at(i,j):用时431ms。
第二种image.ptr(i):用时9.6ms。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值