如何遍历一副图像?简单的方法就是写一个双层循环,增量分别为行和列,如下所示:
Mat img = Mat(rows, cols, CV_8UC3,Scalar(0)); for(int i = 0;i < rows; i++) { for(int j = 0; j < cols; j++) { img.at<Vec3b>(i,j)[0] = 255;
img.at<Vec3b>(i,j)[1] = 255;
img.at<Vec3b>(i,j)[2] = 255; } }
上述在JetSonNano上遍历一张1280×720的图片需要70-80ms!!!
如何高效遍历一副图像?
核心思想有:(1)使用指针,减少底层内存单元操作的次数。(2)减少双重循环中外层循环的操作次数。
如下:
Mat recv_img = Mat(IMGHEIGHT,IMGWIDTH,CV_8UC3,Scalar(0)); int nl = IMGHEIGHT; int nc = IMGWIDTH; int n = 21; if(recv_img.isContinuous()) { nc *= nl; nl = 1; } for(int i = 0; i < nl; i++) { uchar* data = recv_img.ptr<uchar>(i); for(int j = 0; j<nc; j++) { *data++ = remsg.at(n); *data++ = remsg.at(n+1); *data++ = remsg.at(n+2); n = n + 3; } }