顔の検出と認識に取り組んでおり、顔の検出に成功したら、顔をトリミングしてドライブのどこかに保存し、認識コード用に提供したいと思います。関心領域を新しい画像として保存するのに苦労しています。オンラインでいくつかのコードを入手しましたが、IplImage*
を使用する以前のバージョンのOpenCVで記述されています。 cv::Mat
を使用するOpenCV2.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;
}
ありがとう。平和
cv::Mat
オブジェクトを使用すると、コードが大幅に簡素化されます。検出された顔がタイプcv::Rect
のfaceRect
と呼ばれる長方形にあると仮定すると、トリミングされたバージョンを取得するために入力する必要があるのは次のとおりです。
cv::Mat originalImage;
cv::Rect faceRect;
cv::Mat croppedFaceImage;
croppedFaceImage = originalImage(faceRect).clone();
または代わりに:
originalImage(faceRect).copyTo(croppedImage);
これにより、指定した長方形から一時的なcv::Mat
object(データをコピーせずに)が作成されます。次に、実際のデータがcloneまたはcopyメソッドを介して新しいオブジェクトにコピーされます。