每次我识别相机上先前已知的场景时,我都需要使用一组遮罩图像。所有蒙版图像都是IplImage格式。例如,有些情况下,摄像机已经平移到稍微不同但附近的位置。这意味着如果我在当前场景的中间某处进行模板匹配,我将能够在此场景中识别出具有一定量模板移位的场景。我需要做的就是使用这些移动来调整遮罩图像ROI,以便可以根据模板匹配适当地叠加它们。我知道有以下功能:
cvSetImageROI(Iplimage* img, CvRect roi)
cvResetImageROI(IplImage* img);
我可以使用它来设置裁剪/取消我的图像。但是,它不适合我退出我的预期方式。如果有人可以提出替代方案或我做错了什么,甚至是我没有想到的事情,我真的很感激!
**我还必须指出,我需要始终保持图像大小相同。唯一不同的是图像中的实际感兴趣区域。我可以使用零/一填充来覆盖未使用的区域。
答案 0 :(得分:0)
我相信没有制作原始图像的太多副本的解决方案是:
// Make a new IplImage
IplImage* img_src_cpy = cvCreateImage(cvGetSize(img_src), img_src->depth, img_src->nChannels);
// Crop Original Image without changing the ROI
for(int rows = roi.y; rows < roi.height; rows++) {
for(int cols = roi.x; rows < roi.width; cols++) {
img_src_cpy->imageData[(rows-roi.y)*img_src_cpy->widthStep + (cols-roi.x)] = img_src[rows*img_src + cols];
}
{
//Now copy everything to the original image OR simply return the new image if calling from a function
cvCopy(img_src_cpy, img_src); // OR return img_src_cpy;
我尝试了自己的代码,它对我来说也足够快(对于332 x 332灰度图像执行约1毫秒)