1

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

我有一个CvMat*从图像文件中提取的图像,如下所示:

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

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

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

其中minx, maxx, miny, 和maxy定义裁剪区域的边界。有没有内置的方法可以轻松做到这一点?

4

3 回答 3

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 内置了设置您关心的区域并将该区域从图像中复制出来的功能,就像您想要实现的那样。

于 2012-07-30T16:56:25.550 回答
4

如果您想要 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);
于 2014-06-25T12:00:01.000 回答
2

通常这是通过裁剪ROI(感兴趣的区域)来完成的。这篇博文详细介绍了裁剪:

/* 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(legacy OpenCV) 和cvMat(OpenCV 2.x) 之间进行转换,只需使用cvMat构造函数或查看此问题以获取更多方法。

于 2012-07-30T16:55:41.667 回答