crazybird

OpenCV中访问图像像素的三种方法

0
阅读(1537)


OpenCV中访问图像像素的方法有三种:(1)指针访问像素:C操作符[];(2)迭代器操作图像像素;(3)动态地址计算方式访问像素:at。下面举例介绍其用法。

(1)指针访问像素:该方法是三种方法中速度最快的。Mat类提供的ptr函数可以得到图像任意行的首地址。自己所做测试时间:0.00278972秒。

for(int i = 0;i < rowNumber;i++)
{
    uchar* data = OutputArray.ptr<uchar>(i);
    for(int j = 0;j < colNumber;j++)
    {
        data[j] = .....;
    }
}


(2)迭代器操作图像像素:获得图像矩阵的begin和end,增加迭代从begin到end。将*操作符添加在迭代指针前,即可访问当前指向的内容。相比用指针直接访问可能出现越界问题,迭代器绝对安全。自己所做测试时间:0.123954秒。

Mat_<Vec3b>::iterator itBegin = OutputArray.begin<Vec3b>(); //  初始位置的迭代器
Mat_<Vec3b>::iterator itEnd = OutputArray.end<Vec3b>();     //  终止位置的迭代器
for(;itBegin != itEnd;itBegin++)
{
    (*itBegin)[0] = ......;
    (*itBegin)[1] = ......;
    (*itBegin)[2] = ......;
}


(3)动态地址计算方式访问像素:自己所做测试时间:0.144秒。

for(int i = 0;i < rowNumber;i++)
{
    for(int j = 0;j < colNumber;j++)
    {
        OutputArray.at<Vec3b>(i,j)[0] = ......;
        OutputArray.at<Vec3b>(i,j)[1] = ......;
        OutputArray.at<Vec3b>(i,j)[2] = ......;
    }
}