我尝试在OpenCV中的矩阵中提取感兴趣区域(ROI)。通过cv:Rect
,例如im_roi = im(Rect(x,y, width, height))
可以很容易地做到。但是我更喜欢使用指针直接从内存中获取数据,这可能更有效。以下是我的代码:
Mat im_roi; //the desired matrix holding ROI of im, uninitialized
uchar* im_roi_data = im_roi.data;
uchar* im_data = im.data;
int xstart = x;
int xend = xstart + width;
int ystart = y;
int yend = ystart + height;
for(ii=ystart; ii<yend; ii++)
{
for(jj=xstart; jj<xend; jj++) //the typo 'jj<xstart' was corrected
{
*im_roi_data++ = *im_data++;
*im_roi_data++ = *im_data++;
*im_roi_data++ = *im_data++;
}
im_data +=3*(im.cols-width);
}
但是,上面的for循环代码无法继续进行。我认为问题可能是由于未初始化的im_roi
引起的。
答案 0 :(得分:3)
我认为您的第二个for
循环必须是:
for(jj=xstart; jj<xend; jj++)
答案 1 :(得分:2)
正如Mark Setchell所指出的那样,这不是代码的唯一问题,但是是的,您必须先初始化im_roi才能提高其像素。
使用memcpy复制整个行的内容要比逐像素复制数据更有效。
编写im(Rect(x,y, width, height)).copyTo(im_roi);
是应对ROI的最简洁,最快的方法(在这种情况下,您无需初始化im_roi)。