openCV在C中获得子图像

时间:2012-07-30 16:49:58

标签: c image opencv

我在C中使用OpenCV进行图像处理。如果在文档中回答了这个问题,请原谅我,但我发现OpenCV文档非常糟糕且难以阅读。

我有一个CvMat*我从图像文件中提取了如下:

CvMat* mat = cvLoadImageM((char*) filename, CV_LOAD_IMAGE_COLOR);

我需要做的是通过裁剪某个有界区域来获得子图像。对此的逻辑命令可能是:

CvMat* subMat = cvGetSubImage(mat, minx, maxx, miny, maxy);

其中minxmaxxminymaxy定义了裁剪区域的边界。是否有内置的方法可以轻松完成这项工作?

3 个答案:

答案 0 :(得分:8)

查看http://nashruddin.com/OpenCV_Region_of_Interest_(ROI)/

本教程在感兴趣的区域执行以下操作:

cvSetImageROI(img1, cvRect(10, 15, 150, 250));
IplImage *img2 = cvCreateImage(cvGetSize(img1),
                           img1->depth,
                           img1->nChannels);
cvCopy(img1, img2, NULL);
cvResetImageROI(img1);

OpenCV具有内置功能,可以设置您关注的区域,并将该区域从图像中复制出来,就像您想要实现的那样。

答案 1 :(得分:2)

通常,这是通过裁剪ROI(感兴趣的区域)来完成的。这个blog post详细介绍了裁剪:

/* load image */
IplImage *img1 = cvLoadImage("elvita.jpg", 1);

/* sets the Region of Interest
   Note that the rectangle area has to be __INSIDE__ the image */
cvSetImageROI(img1, cvRect(10, 15, 150, 250));

/* create destination image
   Note that cvGetSize will return the width and the height of ROI */
IplImage *img2 = cvCreateImage(cvGetSize(img1),
                               img1->depth,
                               img1->nChannels);

/* copy subimage */
cvCopy(img1, img2, NULL);

/* always reset the Region of Interest */
cvResetImageROI(img1);

要在IplImage(旧版OpenCV)和cvMat(OpenCV 2.x)之间进行转换,只需使用cvMat构造函数或查看this question以获取更多方法。< / p>

答案 2 :(得分:2)

如果你想要src图像的子像素精确矩形截面使用cvGetRectSubPix或cv :: getRectSubPix(这会创建所有数据的单独副本,这不是ROI!)

示例:

cv::Size size(dst_width,dst_height);
cv::Point2f center(src_centerx,src_center_y);
cv::Mat dst;
cv::getRectSubPix(src,size, center,dst,CV_8U);