用OpenCV裁剪图像

问题描述:

我在使用iPhone上的OpenCV库裁剪图像时遇到了问题。我有一个与选定区域的图像,我想裁剪该区域的图像。但新图像不是映射到矩形,新图像也是蓝色文本。用OpenCV裁剪图像

我使用该代码即可裁剪图片:

IplImage *src = [OpenCV CreateIplImageFromUIImage:image]; 


NSValue *val = [corners objectAtIndex:0]; 
CGPoint p1 = [val CGPointValue]; 
val = [corners objectAtIndex:1]; 
CGPoint p2 = [val CGPointValue]; 
val = [corners objectAtIndex:2]; 
CGPoint p3 = [val CGPointValue]; 
val = [corners objectAtIndex:3]; 
CGPoint p4 = [val CGPointValue]; 

float minX = fmin(fmin(p1.x, p2.x), fmin(p3.x, p4.x)); 
float minY = fmin(fmin(p1.y, p2.y), fmin(p3.y, p4.y)); 
float maxX = fmax(fmax(p1.x, p2.x), fmax(p3.x, p4.x)); 
float maxY = fmax(fmax(p1.y, p2.y), fmax(p3.y, p4.y)); 

CGFloat width = maxX - minX; 
CGFloat height = maxY - minY; 

IplImage *dst = cvCreateImage(cvSize(width, height), 8, 3); 

p1 = CGPointMake(p1.x - minX, p1.y - minY); 
p2 = CGPointMake(p2.x - minX, p2.y - minY); 
p3 = CGPointMake(p3.x - minX, p3.y - minY); 
p4 = CGPointMake(p4.x - minX, p4.y - minY); 

IplImage* cropped = cvCreateImage(cvSize(width, height), src->depth, src->nChannels); 

cvSetImageROI(src, cvRect(minX, minY, width, height)); 

cvCopy(src, cropped, NULL); 
cvResetImageROI(src); 
cvReleaseImage(&src); 

CvMat* mmat = cvCreateMat(3, 3, CV_32FC1); 

CvPoint2D32f *c1 = (CvPoint2D32f *)malloc(4 * sizeof(CvPoint2D32f)); 
CvPoint2D32f *c2 = (CvPoint2D32f *)malloc(4 * sizeof(CvPoint2D32f)); 

c1[0].x = p1.x; c1[0].y = p1.y; 
c1[1].x = p4.x; c1[1].y = p4.y; 
c1[2].x = p2.x; c1[2].y = p2.y; 
c1[3].x = p3.y; c1[3].y = p3.y; 

c2[0].x = 0; c2[0].y = 0; 
c2[1].x = width; c2[1].y = 0; 
c2[2].x = 0; c2[2].y = height; 
c2[3].x = width; c2[3].y = height; 

    mmat = cvGetPerspectiveTransform(c1, c2, mmat); 
cvWarpPerspective(cropped, dst, mmat, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); 

我会感谢任何帮助。

+0

为什么不尝试在不使用扭曲的情况下看到裁剪后的图像? – rics 2010-09-25 20:11:27

+0

选中的不能是矩形。它可以是任何四边形,我想先将该图像裁剪到该四边形,然后将该四边形映射到矩形。但有了上述功能,我只能将图像裁剪到矩形区域,并且翘曲不起作用。 – 2010-09-27 07:41:50

+0

我们如何检测角落?你能给我提供指导方针或一点点代码吗? – QueueOverFlow 2012-10-27 09:24:04

我的代码有错误。如果有人对此感兴趣,请点击这里工作代码:

IplImage *src = [OpenCV CreateIplImageFromUIImage:image]; 

IplImage *dst = cvCloneImage(src); 
dst->origin = src->origin; 
dst->nChannels = src->nChannels; 
dst->depth = src->depth; 

cvZero(dst); 

NSValue *val = [corners objectAtIndex:0]; 
CGPoint p1 = [val CGPointValue]; 
val = [corners objectAtIndex:1]; 
CGPoint p2 = [val CGPointValue]; 
val = [corners objectAtIndex:2]; 
CGPoint p3 = [val CGPointValue]; 
val = [corners objectAtIndex:3]; 
CGPoint p4 = [val CGPointValue]; 

CGFloat width = src->width; 
CGFloat height = src->height; 

CvMat* mmat = cvCreateMat(3, 3, CV_32FC1); 

CvPoint2D32f *c1 = (CvPoint2D32f *)malloc(4 * sizeof(CvPoint2D32f)); 
CvPoint2D32f *c2 = (CvPoint2D32f *)malloc(4 * sizeof(CvPoint2D32f)); 

c1[0].x = round(p1.x); c1[0].y = round(p1.y); 
c1[1].x = round(p4.x); c1[1].y = round(p4.y); 
c1[2].x = round(p2.x); c1[2].y = round(p2.y); 
c1[3].x = round(p3.x); c1[3].y = round(p3.y); 

c2[0].x = 0;   c2[0].y = 0; 
c2[1].x = width -1;  c2[1].y = 0; 
c2[2].x = 0;   c2[2].y = height - 1; 
c2[3].x = width - 1; c2[3].y = height - 1; 

mmat = cvGetPerspectiveTransform(c1, c2, mmat); 
free(c1); 
free(c2); 

cvWarpPerspective(src, dst, mmat, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); 

cvReleaseImage(&src); 
cvReleaseMat(&mmat); 

UIImage *newImage = [OpenCV UIImageFromIplImage:dst]; 
cvReleaseImage(&dst);