【发布时间】:2016-03-07 21:35:45
【问题描述】:
我正在尝试使用透视来扭曲图像,但是当我尝试它时,dst 图像是全黑的。我能做错什么?
在我的代码中,pt0、pt1、pt2 和 pt3 是我想要扭曲的多边形的角
我的代码:
private void perspective(IplImage src, CvPoint pt0, CvPoint pt1, CvPoint pt2, CvPoint pt3) {
CvPoint2D32f srcQuad = new CvPoint2D32f(4), dstQuad = new CvPoint2D32f(4);
CvMat warp_matrix = cvCreateMat(3, 3, CV_32FC1);
IplImage dst = cvCloneImage(src);
srcQuad.position(0).x(pt0.x()); //src Top left
srcQuad.position(0).y(pt0.y());
srcQuad.position(1).x(pt1.x()); //src Top right
srcQuad.position(1).y(pt1.y());
srcQuad.position(2).x(pt2.x()); //src Bottom left
srcQuad.position(2).y(pt2.y());
srcQuad.position(3).x(pt3.x()); //src Bot right
srcQuad.position(3).y(pt3.y());
dstQuad.position(0).x(0); //dst Top left
dstQuad.position(0).y(0);
dstQuad.position(1).x(src.width() - 1); //dst Top right
dstQuad.position(1).y(0);
dstQuad.position(2).x(0); //dst Bottom left
dstQuad.position(2).y(src.height() - 1);
dstQuad.position(3).x(src.width() - 1); //dst Bot right
dstQuad.position(3).y(src.height() - 1);
cvGetPerspectiveTransform(srcQuad, dstQuad, warp_matrix);
cvWarpPerspective(src, dst, warp_matrix);
cvShowImage("Original", src);
}
谁能知道我做错了什么?谢谢!
好吧,我在python中找到了一段代码并为JavaCV编辑,该方法效果很好:
private void perspective(IplImage src, CvPoint pt0, CvPoint pt1, CvPoint pt2, CvPoint pt3) {
CvMat p = cvCreateMat(2, 4, CV_64FC1);
CvMat h = cvCreateMat(2, 4, CV_64FC1);
CvMat p2h = cvCreateMat(3, 3, CV_64FC1);
cvZero(p);
cvZero(h);
cvZero(p2h);
p.put(0, 0, pt0.x());
p.put(1, 0, pt0.y());
p.put(0, 1, pt1.x());
p.put(1, 1, pt1.y());
p.put(0, 2, pt2.x());
p.put(1, 2, pt2.y());
p.put(0, 3, pt3.x());
p.put(1, 3, pt3.y());
h.put(0, 0, 0);
h.put(1, 0, 0);
h.put(0, 1, src.width());
h.put(1, 1, 0);
h.put(0, 2, 0);
h.put(1, 2, src.height());
h.put(0, 3, src.width());
h.put(1, 3, src.height());
cvFindHomography(p, h, p2h);
cvWarpPerspective(src, src, p2h);
}
所以,我会理所当然地接受唯一的答案,TY!
【问题讨论】:
-
检查输入点的顺序,其实是TL-TR-BL-BR
-
是的,“pt”是我需要的点......
标签: java opencv image-processing javacv perspective