OpenCv 裁剪问题

Posted

技术标签:

【中文标题】OpenCv 裁剪问题【英文标题】:OpenCv Cropping issue 【发布时间】:2014-09-23 09:07:26 【问题描述】:

我是 openCV 的新手。我正在尝试裁剪图像,但我编写的代码没有裁剪它。请帮帮我。我得到了我感兴趣的区域,但是当我尝试复制它时,它不仅复制了整个图像,而且还复制了感兴趣的区域

#include<iostream>
using namespace std;
#include<vector>
#include<iostream>
#include<opencv2\opencv.hpp>


CvMemStorage * st = 0;
CvHaarClassifierCascade * hcc= 0;
char * path =  "C:/Users/Gardezi/Documents/Visual Studio 2012/Projects/AIMRL/AIMRL/haarcascade_frontalface_alt.xml";



bool startDetection(IplImage * img)
   
int i ;
cvCreateImage(cvGetSize(img) , img->depth , img->nChannels );
CvPoint pt1 , pt2;
IplImage * f ;
if (hcc)

        CvSeq * face = cvHaarDetectObjects(img , hcc , st , 1.1  , 2 , CV_HAAR_DO_CANNY_PRUNING , cvSize(40  , 40 ) );


    //Face to Data Base 

    for (i = 0 ;i <  (face? face->total : 0 ) ; i++)
    
        CvRect * r = (CvRect*)cvGetSeqElem(face , i );
        pt1.x = r->x; 
        pt1.y = r->y;
        pt2.x = r->x + r->width;
        pt2.y = r->y + r->height;

    cvRectangle(img , pt1 , pt2 , CV_RGB(255, 0 , 0) , 3 , 8 , 0); 

        cvSetImageROI(img , cvRect(pt1.x , pt1.y , pt2.x , pt2.y));


        f =  cvCreateImage( cvGetSize( img) , img->depth , img->nChannels );

        cvCopy(img , f , NULL );

    




cvShowImage("Result" , f );
cvWaitKey(0);
return true;




void main()

IplImage * img;
hcc = (CvHaarClassifierCascade *)cvLoad(path , 0 , 0 , 0 );
img = cvLoadImage("download.jpg" , 0);
st = cvCreateMemStorage(0);
startDetection(img);

【问题讨论】:

【参考方案1】:

如果你是 Opencv 新手,那么不要使用 IplImage,而是使用 cv::Mat。使用运算符括号进行裁剪很简单,如果您需要在新图像中复制感兴趣的区域,请调用 clone()。

cv::Rect roi;
cv::Mat image;
[...] //Initialization of roi and image
cv::Mat roiOfImage = image(roi);
cv::Mat deepCopyOfRoiImage = image(roi).clone();

【讨论】:

我想问你是怎么做到的:cv::Mat roiOfImage = image(roi) 当我尝试这样做时,它给了我一个错误

以上是关于OpenCv 裁剪问题的主要内容,如果未能解决你的问题,请参考以下文章

在opencv中裁剪旋转图像

OpenCV校准相机裁剪错误

裁剪和旋转图片 OpenCV

OpenCV:用高斯模糊裁剪图像

OpenCV 裁剪函数致命信号 11

OpenCV 从摄像头裁剪实时提要