【问题标题】:crop and Save ROI as new image in OpenCV 2.4.2 using cv::Mat使用 cv::Mat 在 OpenCV 2.4.2 中裁剪和保存 ROI 作为新图像
【发布时间】:2013-04-07 12:04:42
【问题描述】:

进行人脸检测和识别,在成功检测到人脸后,我只想裁剪人脸并将其保存在驱动器中的某个位置以提供识别码。我很难将感兴趣的区域保存为新图像。我在网上有一些代码,但它是用以前版本的 OpenCV 编写的,它使用 IplImage*。我正在使用使用 cv::Mat 的 OpenCV 2.4.2。
Heeeelp !!!
如果你们想要的话,我会发布我的代码(人脸检测和识别本身)。

#include <cv.h>
#include <highgui.h>
#include <math.h>

// alphablend <imageA> <image B> <x> <y> <width> <height>
// <alpha> <beta>

IplImage* crop( IplImage* src,  CvRect roi)
{

  // Must have dimensions of output image
  IplImage* cropped = cvCreateImage( cvSize(roi.width,roi.height), src->depth, src->nChannels );

  // Say what the source region is
  cvSetImageROI( src, roi );

  // Do the copy
  cvCopy( src, cropped );
  cvResetImageROI( src );

  cvNamedWindow( "check", 1 );
  cvShowImage( "check", cropped );
  cvSaveImage ("style.jpg" , cropped);

  return cropped;
}

int main(int argc, char** argv)
{
  IplImage *src1, *src2;

  CvRect myRect;

  // IplImage* cropped ;
  src1=cvLoadImage(argv[1],1);
  src2=cvLoadImage(argv[2],1);

  {
    int x = atoi(argv[3]);
    int y = atoi(argv[4]);
    int width = atoi(argv[5]);
    int height = atoi(argv[6]);

    double alpha = (double)atof(argv[7]);
    double beta = (double)atof(argv[8]);

    cvSetImageROI(src1, cvRect(x,y,width,height));
    cvSetImageROI(src2, cvRect(100,200,width,height));

    myRect = cvRect(x,y,width,height) ;

    cvAddWeighted(src1, alpha, src2, beta,0.0,src1);

    cvResetImageROI(src1);
    crop (src1 , myRect);

    cvNamedWindow( "Alpha_blend", 1 );
    cvShowImage( "Alpha_blend", src1 );

    cvWaitKey(0);
  }

  return 0;
}

谢谢。和平

【问题讨论】:

  • 在opencv教程文件夹中有一段关于人脸检测的代码。考虑那个。您必须使用cv::imwrite 来保存文件。
  • 你还有识别、裁剪和检测的代码吗?我有完全相同的项目!

标签: opencv crop face-detection roi


【解决方案1】:

使用cv::Mat 对象将使您的代码更加简单。假设检测到的人脸位于一个名为 faceRect 类型为 cv::Rect 的矩形中,您只需输入以下内容即可获得裁剪版本:

cv::Mat originalImage;
cv::Rect faceRect;
cv::Mat croppedFaceImage;

croppedFaceImage = originalImage(faceRect).clone();

或者:

originalImage(faceRect).copyTo(croppedImage);

这会从您提供的矩形中创建一个临时的cv::Matobject(不复制数据)。然后,通过克隆或复制方法将真实数据复制到您的新对象中。

【讨论】:

  • 我已经用 IplImage* 进行了裁剪,我想要做的是分别保存所有裁剪的面孔,并作为新图像保存在我的计算机硬盘上。保存这些图像的目的是为另一个识别代码提供他们的路径。对我来说,这里的困难是,在检测到多个面孔之后,如何为每个检测到的面孔分配一个特定的名称(使用 cvNamedWindow())然后保存这些图像,调用并提供这些路径保存图像到识别码。
【解决方案2】:

为了裁剪区域,使用了 ROI(感兴趣区域)。 opencv2 很容易完成这项工作。您可以查看链接: http://life2coding.blogspot.com/search/label/cropping%20of%20image

【讨论】:

  • 能否总结一下链接内容,以防链接失效?
  • 链接就是这样做的……它死了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多