繁体   English   中英

使用OpenCV / JavaCV的透视图

[英]Perspective Image with OpenCV/JavaCV

我正在尝试使用透视图扭曲图像,但是当我尝试它时,dst图像为全黑。 我该怎么办? 在我的代码中, pt0pt1pt2pt3是多边形的角。

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!

我记得我也遇到过类似的问题。 您可以尝试增加dst图像的大小。 例如,使其成为src图像大小的两倍。

为了使您更清楚地了解,C ++语法为:

Mat dst = Mat::zeros(Size(src.cols*2, src.rows*2), CV_8UC1);

祝好运 !

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM