欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Opencv透視變換綜合實(shí)例詳解

 更新時(shí)間:2019年05月21日 10:01:44   作者:東城青年  
這篇文章主要為大家詳細(xì)介紹了Opencv透視變換綜合實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Opencv透視變換綜合實(shí)例的具體代碼,供大家參考,具體內(nèi)容如下

案例背景:對(duì)下面發(fā)生畸變的圖像進(jìn)行校正

方案思路:灰度二值化分割,閉操作,尋找輪廓,霍夫直線檢測(cè),直線排序,直線方程,直線交點(diǎn),透視矩陣,透視變換。

#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main(int arc, char** argv) { 
 Mat src = imread("1.jpg");
 namedWindow("input", CV_WINDOW_AUTOSIZE);
 imshow("input", src);
 //灰度化
 Mat grayImg;
 cvtColor(src, grayImg, CV_BGR2GRAY);
 
 //二值化
 Mat binaryImg;
 threshold(grayImg, binaryImg, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
 
 //閉操作
 Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));
 morphologyEx(binaryImg, binaryImg, MORPH_CLOSE,kernel,Point(-1,-1) ,3);
 imshow("output", binaryImg);
 
 //尋找輪廓
 Mat draw = Mat::zeros(src.size(), CV_8UC3);
 vector<vector<Point>>contours;
 findContours(binaryImg, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
 for (int i = 0; i < contours.size(); i++) {
 Rect rect = boundingRect(contours[i]);
 if (rect.width < src.cols / 2 && rect.height < src.rows / 2)continue;
 drawContours(draw, contours, i, Scalar(0, 0, 255), 2);
 }
 imshow("output2", draw);
 
 //霍夫直線檢測(cè)
 vector<Vec4i> lines;
 cvtColor(draw, draw, CV_BGR2GRAY);
 HoughLinesP(draw, lines, 1, CV_PI / 180, src.rows/2,src.rows/2,0);
 Mat draw2 = Mat::zeros(src.size(), CV_8UC3);
 for (int j = 0; j < lines.size(); j++) {
 Vec4i ln = lines[j];
 line(draw2, Point(ln[0], ln[1]), Point(ln[2], ln[3]), Scalar(0, 255, 0), 2); 
 }
 printf("number of line:%d\n", lines.size());
 imshow("output3", draw2);
 
 //尋找與定位直線
 Vec4i topLine,bottomLine,leftLine,rightLine;
 for (int j = 0; j < lines.size(); j++) {
 Vec4i ln = lines[j];
 if (ln[1] < src.rows / 2 && ln[3] < src.rows / 2) {
  topLine = ln;
 }
 if (ln[1] > src.rows / 2 && ln[3] > src.rows / 2) {
  bottomLine = ln;
 }
 if (ln[0] < src.cols / 2 && ln[2] < src.cols / 2) {
  leftLine = ln;
 }
 if (ln[0] > src.cols / 2 && ln[2] > src.cols / 2) {
  rightLine = ln;
 }
 }
 cout << "topLine:p1(x,y)=" << topLine[0] << "," << topLine[1]<<" " << "p2(x,y)=" << topLine[2] << "," << topLine[3] << endl;
 cout << "bottomLine:p1(x,y)=" << bottomLine[0] << "," << bottomLine[1] << " " << "p2(x,y)=" << bottomLine[2] << "," << bottomLine[3] << endl;
 cout << "leftLine:p1(x,y)=" << leftLine[0] << "," << leftLine[1] << " " << "p2(x,y)=" << leftLine[2] << "," << leftLine[3] << endl;
 cout << "rightLine:p1(x,y)=" << rightLine[0] << "," << rightLine[1] << " " << "p2(x,y)=" << rightLine[2] << "," << rightLine[3] << endl;
 
 //求解直線方程
 float k1, c1;
 k1 = float((topLine[3] - topLine[1])) / float(topLine[2] - topLine[0]);
 c1 = topLine[1] - k1*topLine[0];
 float k2, c2;
 k2 = float((bottomLine[3] - bottomLine[1])) / float(bottomLine[2] - bottomLine[0]);
 c2 = bottomLine[1] - k2*bottomLine[0];
 float k3, c3;
 k3 = float((leftLine[3] - leftLine[1])) / float(leftLine[2] - leftLine[0]);
 c3 = leftLine[1] - k3*leftLine[0];
 float k4, c4;
 k4 = float((rightLine[3] - rightLine[1])) / float(rightLine[2] - rightLine[0]);
 c4 = rightLine[1] - k4*rightLine[0];
 
 //求解直線交點(diǎn)
 Point p1;
 p1.x = (int)((c1 - c3) / (k3 - k1));
 p1.y = (int)(k1*p1.x + c1);
 Point p2;
 p2.x = (int)((c1 - c4) / (k4 - k1));
 p2.y = (int)(k1*p2.x + c1);
 Point p3;
 p3.x = (int)((c2 - c4) / (k4 - k2));
 p3.y = (int)(k2*p3.x + c2);
 Point p4;
 p4.x = (int)((c2 - c3) / (k3 - k2));
 p4.y = (int)(k2*p4.x + c2);
 cout << "左上角:" << p1.x << "," << p1.y << endl;
 cout << "右上角:" << p2.x << "," << p2.y << endl;
 cout << "右下角:" << p3.x << "," << p3.y << endl;
 cout << "左下角:" << p4.x << "," << p4.y << endl;
 
 //畫出交點(diǎn)
 circle(draw2, p1, 2, Scalar(0, 0, 255));
 circle(draw2, p2, 2, Scalar(0, 0, 255));
 circle(draw2, p3, 2, Scalar(0, 0, 255));
 circle(draw2, p4, 2, Scalar(0, 0, 255));
 imshow("output4", draw2);
 
 //透視變換
 vector<Point2f> srcCorners(4);
 srcCorners[0] = p1;
 srcCorners[1] = p2;
 srcCorners[2] = p3;
 srcCorners[3] = p4;
 vector<Point2f> dstCorners(4);
 dstCorners[0] = Point(0, 0);
 dstCorners[1] = Point(src.cols, 0);
 dstCorners[2] = Point(src.cols, src.rows);
 dstCorners[3] = Point(0, src.rows); 
 Mat warpMartrix = getPerspectiveTransform(srcCorners, dstCorners);//Mat warpMartrix = findHomography(srcCorners, dstCorners); 
 Mat result = Mat::zeros(src.size(), -1);
 warpPerspective(src, result, warpMartrix, result.size(),INTER_LINEAR);
 imshow("output5", result);
 waitKey(0);
 return 0; 
}

原圖像

二值化閉操作

尋找輪廓

霍夫直線

直線及其交點(diǎn)

效果圖

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言和go語(yǔ)言之間的交互操作方法

    C語(yǔ)言和go語(yǔ)言之間的交互操作方法

    下面小編就為大家?guī)?lái)一篇C語(yǔ)言和go語(yǔ)言之間的交互操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • C語(yǔ)言超詳細(xì)講解雙向帶頭循環(huán)鏈表

    C語(yǔ)言超詳細(xì)講解雙向帶頭循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單
    2023-02-02
  • c++連接mysql5.6的出錯(cuò)問(wèn)題總結(jié)

    c++連接mysql5.6的出錯(cuò)問(wèn)題總結(jié)

    下面小編就為大家?guī)?lái)一篇c++連接mysql5.6的出錯(cuò)問(wèn)題總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦
    2016-12-12
  • C語(yǔ)言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)

    C語(yǔ)言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)

    strcmp函數(shù)語(yǔ)法為“int strcmp(char *str1,char *str2)”,其作用是比較字符串str1和str2是否相同,如果相同則返回0,如果不同,前者大于后者則返回1,否則返回-1
    2022-05-05
  • 重構(gòu)-C++實(shí)現(xiàn)矩陣的簡(jiǎn)單實(shí)例

    重構(gòu)-C++實(shí)現(xiàn)矩陣的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇重構(gòu)-C++實(shí)現(xiàn)矩陣的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • C語(yǔ)言實(shí)現(xiàn)通訊錄功能的流程與代碼

    C語(yǔ)言實(shí)現(xiàn)通訊錄功能的流程與代碼

    通訊錄是一個(gè)可以記錄親人、好友信息的工具,這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實(shí)例代碼

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實(shí)例代碼

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++中std::vector的6種初始化方式

    C++中std::vector的6種初始化方式

    這篇文章主要介紹了C++中std::vector的6種初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • c語(yǔ)言定時(shí)器示例分享

    c語(yǔ)言定時(shí)器示例分享

    在linux下開發(fā),使用的是C語(yǔ)言。適用于需要定時(shí)的軟件開發(fā),以系統(tǒng)真實(shí)的時(shí)間來(lái)計(jì)算,它送出SIGALRM信號(hào)。每隔一秒定時(shí)一次
    2014-04-04
  • QT實(shí)現(xiàn)貪吃蛇游戲

    QT實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評(píng)論