OpenCv遍历图像小结

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

http://blog.****.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 = ; i < row; ++i)
{
uchar *srcptr = src.ptr<uchar>(i);
uchar *dstptr = dst.ptr<float>(i);
for (int j = ; 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", );
//通过指针遍历彩色图像
uchar *data = src.data;
int i = ;
int j = ;
  //获取第i行 第j列的元素RGB值
  //获取B通道
int pix1 = src.at<Vec3b>(i, j)[];
int pix2 = *(data + i * src.step + j* src.elemSize()+);
cout << pix1 << " " << pix2 << endl;
cout << src.step << " " << src.elemSize() << endl;

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

channel = 

int row = src.rows;
int col = src.cols; Mat dst = Mat(row, col, CV_16UC3);
for (int i = ; i < row; ++i)
{
ushort *dataWarpRow = dst.ptr<ushort>(i);
for (int j = ; j < col; ++j)
{ ushort *dataWarpCol = dataWarpRow + j * src.channels();
if ((dataWarpCol)[] == && (dataWarpCol)[] == && (dataWarpCol)[] == )
{
;
}
}
}
上一篇:JavaScript的sleep实现--Javascript异步编程学习


下一篇:GIL线程全局锁 协程