【问题标题】:Crop image with OpenCV使用 OpenCV 裁剪图像
【发布时间】:2011-07-08 15:52:39
【问题描述】:

我在 iPhone 上使用 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));

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 您为什么不尝试在不使用变形的情况下查看裁剪后的图像?
  • 选择的不能是矩形。它可以是任何四边形,我想先将图像裁剪为该四边形,然后将该四边形映射为矩形。但是使用上述功能,我只能将图像裁剪为矩形区域,并且变形效果不佳。
  • 我们如何检测角点?你能给我一些指导方针或一些代码吗?
  • Gryphon,我正在使用 OpenCV 库,在那里你可以找到一个函数 CvHoughLines2。给我电子邮件或其他东西,然后我可以将我拥有的东西发送给您,但该解决方案并不完美,但我不知道如何以其他方式做到这一点

标签: iphone opencv


【解决方案1】:

我的代码有错误。如果有人对这里感兴趣的是工作代码:

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

【讨论】:

    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2023-03-05
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多