c – OpenCV图像转换和透视变化

前端之家收集整理的这篇文章主要介绍了c – OpenCV图像转换和透视变化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试实现以下效果,这里使用GIMP中的透视工具显示.

原始图像(620×466像素)

转变形象

我所拥有的是一个固定的网络摄像头,并且想要插入上述转换矩阵图,导致梯形的无失真输出.

我知道还有其他选项可用于在OpenCV中保留图像,但我真的希望手动提供转换矩阵数据,最后以梯形图像.

从阅读周围我有一个感觉warpPerspective,findHomography或getPerspectiveTransform可能是有用的,但不知道如何去做这个在C

任何有用的建议将不胜感激.

尝试运行以下代码,但我只得到一个1像素显示的窗口.

也许我以像素指定点的方式,这是正确的吗?

#include <opencv2/core/core.hpp>
    #include <opencv2/opencv.hpp>
    #include <cv.h>
    #include <opencv2/highgui/highgui.hpp>
    #include <iostream>

    using namespace cv;
    using namespace std;

            cv::Mat OpenWarpPerspective(const cv::Mat& _image,const cv::Point2f& _lu,const cv::Point2f& _ru,const cv::Point2f& _rd,const cv::Point2f& _ld,const cv::Point2f& _lu_result,const cv::Point2f& _ru_result,const cv::Point2f& _rd_result,const cv::Point2f& _ld_result,cv::Mat& _transform_matrix)
            {
              // todo do some checks on input.

              cv::Point2f source_points[4];
              cv::Point2f dest_points[4];


              source_points[0] = _lu;
              source_points[1] = _ru;
              source_points[2] = _rd;
              source_points[3] = _ld;

              dest_points[0] = _lu_result;
              dest_points[1] = _ru_result;
              dest_points[2] = _rd_result;
              dest_points[3] = _ld_result;

              cv::Mat dst;
              _transform_matrix = cv::getPerspectiveTransform(source_points,dest_points);
              cv::warpPerspective(_image,dst,_transform_matrix,dst.size());

              return dst;  
            }

    int main( int argc,char** argv )
    {

        Mat image;
        Mat edited;

        image = imread("c:/org.png",CV_LOAD_IMAGE_COLOR);   // Read the file

        namedWindow( "Display window",CV_WINDOW_AUTOSIZE );// Create a window for display.

            Point2f one = (0.0,0.0);
            Point2f two = (317.0,0.0);
            Point2f three = (317.0,240.0);
            Point2f four = (0.0,240.0);

            Point2f five = (-100.0,0.0);
            Point2f six = (617.0,0.0);
            Point2f seven = (317.0,240.0);
            Point2f eight = (0.0,240.0);

            OpenWarpPerspective(image,one,two,three,four,five,six,seven,eight,edited);  

        imshow( "Display window",edited );                   // Show our image inside it.

        waitKey(0);                                          // Wait for a keystroke in the window
        return 0;
}

解决方法

如果你有三个角点使用Warp Affine变换.如果你有四个角点,使用变形透视变换.这里是如何使用变形透视变换.选择图像的四个角点.然后选择所需矩形的四个对应点.经编变换将做其他事情.
cv::Mat OpenWarpPerspective(const cv::Mat& _image,cv::Mat& _transform_matrix)
{
  // todo do some checks on input.

  cv::Point2f source_points[4];
  cv::Point2f dest_points[4];


  source_points[0] = _lu;
  source_points[1] = _ru;
  source_points[2] = _rd;
  source_points[3] = _ld;

  dest_points[0] = _lu_result;
  dest_points[1] = _ru_result;
  dest_points[2] = _rd_result;
  dest_points[3] = _ld_result;

  cv::Mat dst;
  _transform_matrix = cv::getPerspectiveTransform(source_points,dest_points);
  cv::warpPerspective(_image,cv::Size(_width,_height));

  return dst;  
}

猜你在找的C&C++相关文章