我在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
定义了裁剪区域的边界。是否有内置的方法可以轻松完成这项工作?
答案 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);