2012-07-30 70 views
1

我在C中使用OpenCV进行图像处理。请原谅我是否在文档中回答了这个问题,但是我发现OpenCV文档形成得很糟糕,难于阅读。openCV在C中获取子图像

我有我有如下的图像文件中提取的CvMat*

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

我需要做的是通过裁剪出一定的界区域获得的一个子图像。这方面的一个逻辑命令可能是:

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

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

回答

7

看看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的内置功能,用于设置你关心的地区和复制该区域出于图像,就像你想要达到的一样。

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更多的方法。

+0

http://stackoverflow.com/questions/14756505/croping-an-image-in-ios-uisng-opencv-face-detect我面临在与opencv iPhone的裁剪问题。可以请看看..我的投资回报率变得越来越差我想.. – 2vision2 2013-02-07 19:02:26

2

如果你想要一个src图像使用cvGetRectSubPix或CV :: getRectSubPix的子像素精度的矩形截面(此创建所有数据的复制个体,这是不是一个投资回报率!)

例子:

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); 
+0

哦,顺便说一句:对于我使用的投资回报率: 'cv :: Mat newRoi = srcMat(cv :: Rect(roiX,roiY,roiW,roiH)) ;' – 2015-10-19 08:48:42