opencv 透视变换

什么是透视变换:

1、透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。

照片有时候会因为拍摄角度问题,物体表面并不是平行于摄像头的平面,或者说垂直采集的图像,这样就导致了角度的存在。

数学知识

| a |*cosΘ叫做向量a在向量b上的投影

向量a·向量b=| a |*| b |*cosΘ(Θ为两向量夹角)

| b |*cosΘ叫做向量b在向量a上的投影

投影 (tóuyǐng),数学术语,指图形的影子投到一个面或一条线上。

扩展资料

设两个非零向量a与b的夹角为θ,则将|b|·cosθ 叫做向量b在向量a方向上的投影或称标投影。

在式中引入a的单位矢量a(A),可以定义b在a上的矢投影

由定义可知,一个向量在另一个向量方向上的投影是一个数量。当θ为锐角时,它是正值;当θ为直角时,它是0;当θ为钝角时,它是负值;当θ=0°时,它等于|b|;当θ=180°时,它等于-|b|。

设单位向量e是直线m的方向向量,向量AB=a,作点A在直线m上的射影A',作点B在直线m上的射影B',则向量A'B' 叫做AB在直线m上或在向量e方向上的正射影,简称射影。

令投射线通过点或其他物体,向选定的投影面投射,并在该面上得到图形的方法称为投影法。

投影法分为中心投影法和平行投影法。

工程中常用的投影图有:多面正投影图、轴测投影图、标高投影图、透视投影图。其中多面正投影图是工程中最常用、最重要的投影图。


如下图

透视变换用于矫正这个问题。


black102.jpg


opencv  提供了透视变换的API,可以使用。


    qt下使用一按钮触发。代码如下



void ProcessImage::on_pushButton_2_clicked()
{
    QString path = QFileDialog::getOpenFileName(this, tr("选择图片"), "/home/pi/Pictures", tr("Image Files(*.jpg *.png)"));

      Mat src = imread(path.toUtf8().data());
      Mat dst ;//= Mat::zeros(640, 460, CV_8UC3); //我要转化为512*512大小的

     // cv::resize(src, dst, dst.size());
     // cvtColor( src, src, CV_RGB2BGR );


      vector<Point2f>src_corners(4);
      src_corners[0] = Point2f(106,132);
      src_corners[1] = Point2f(422,132);
      src_corners[2] = Point2f(0,412);
      src_corners[3] = Point2f(496,446);
      vector<Point2f>dst_corners(4);
      dst_corners[0] = Point2f(0, 0);
      dst_corners[1] = Point2f(511, 0);
      dst_corners[2] = Point2f(0, 510);
      dst_corners[3] = Point2f(511, 510);
      Mat warpMatrix = getPerspectiveTransform(src_corners,dst_corners);

      warpPerspective(src,dst,warpMatrix,dst.size(),INTER_LINEAR,BORDER_CONSTANT);


    //  QImage img2 = QImage( (const unsigned char*)(thresh.data), thresh.cols, thresh.rows, QImage::Format_Grayscale8 );
      QImage img2 = QImage( (const unsigned char*)(dst.data), dst.cols, dst.rows, QImage::Format_RGB888 );

      ui->labelview_2->setPixmap( QPixmap::fromImage(img2));
      ui->labelview_2->resize( ui->labelview_2->pixmap()->size());
}



效果图如下

微信截图_20210317171828.png


已经保证图片是24bit 图片,否则会出现偏差。


sitemap