OpenCv遍历图像小结

参考:http://www.cnblogs.com/ronny/p/opencv_road_2.html

http://blog.csdn.net/xiaowei_cqu/article/details/7771760

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html

http://segmentfault.com/a/1190000000598650

本文主要是在opencv2.0以后的版本,使用Mat作为数据的基本操作类型。

最快的方法-----使用指针遍历图像

1 遍历单通道图像

 利用指针访问

    
Mat src = imread("lena.jpg", 0);
Mat dst = Mat(src.rows, src.cols, CV8U_C1);

for (int i = 0; i < row; ++i) { uchar *srcptr = src.ptr<uchar>(i); uchar *dstptr = dst.ptr<float>(i); for (int j = 0; j < col; ++j) { *(dstptr + j) = *(srcptr + j); } }

 利用at访问

    cv::Mat srcgrayimg;
    cv::cvtColor(srcimg, srcgrayimg, CV_BGR2GRAY);
    for (int y = facetybegin; y < facetyend; ++y)
    {
        for (int x = facetybegin; x < facetyend; ++x)
        {
            FacePoint dstpoint;
            dstpoint.x = x;
            dstpoint.y = y;
            if (isPointInRect(dstpoint, quadrilateralLeft) == true)
            {
                sumLeft += srcgrayimg.at<uchar>(y, x);
                areaLeft++;
            }
            if (isPointInRect(dstpoint, quadrilateralRight) == true)
            {
                sumRight += srcgrayimg.at<uchar>(y, x);
                areaRight++;
            }
        }
    }

 

2 遍历彩色图像

这里可以通过两种方式Vec3b和step elemSize两种方式来访问

    Mat src = imread("lena.jpg", 1);
    //通过指针遍历彩色图像
    uchar *data = src.data;
    int i = 100;
    int j = 100;
  //获取第i行 第j列的元素RGB值
  //获取B通道
int pix1 = src.at<Vec3b>(i, j)[0]; int pix2 = *(data + i * src.step + j* src.elemSize()+0); cout << pix1 << " " << pix2 << endl; cout << src.step << " " << src.elemSize() << endl;

 

通过指针,适合与任何通道的图像

channel = 3

int row = src.rows;
int col = src.cols;

Mat dst = Mat(row, col, CV_16UC3);
for (int i = 0; i < row; ++i)
{
    ushort  *dataWarpRow = dst.ptr<ushort>(i);
    for (int j = 0; j < col; ++j)
    {

        ushort  *dataWarpCol = dataWarpRow + j * src.channels();
        if ((dataWarpCol)[0] == 0 && (dataWarpCol)[1] == 0 && (dataWarpCol)[2] == 0)
        {
            ;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值