亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

OpenCV霍夫變換(Hough Transform)直線檢測詳解

2020-05-23 13:21:57
字體:
來源:轉載
供稿:網友

霍夫變換(Hough Transform)的主要思想:

一條直線在平面直角坐標系(x-y)中可以用y=ax+b式表示,對于直線上一個確定的點(x0,y0),總符合y0-ax0=b,而它可以表示為參數平面坐標系(a-b)中的一條直線。因此,圖像中的一個點對應參數平面的一條直線,同樣,圖像中的一條直線對應參數平面上的一個點。

基本Hough變換檢測直線:

由于同一條直線上的不同點在參數平面中是會經過同一個點的多條線。對圖像的所有點作霍夫變換,檢測直線就意味著找到對應參數平面中的直線相交最多的點。對這些交點做票數累計,然后取出票數大于最小投票數的點,即為原坐標系里檢測出的直線。

一般,直線的參數方程為 ρ=xcosθ+ysinθ

OpenCV中的基本霍夫變換直線檢測函數 cv::HoughLines:

函數輸入為一幅二值圖像(有很多待檢測點),其中一些點排列后形成直線,通常這是一幅邊緣圖像,比如來自Sobel算子或Canny算子。函數的輸出是cv::Vec2f的向量,每個元素都是一對代表檢測到的直線的浮點數(ρ, θ)。函數的作法是先求出原圖像中每點的極坐標方程,若相交于一點的極坐標曲線的個數大于最小投票數,則將該點(ρ, θ)(參數坐標系點)放入輸出向量。

#include "opencv2/highgui.hpp"#include "opencv2/core.hpp"#include "opencv2/imgproc.hpp"#include <iostream> #define PI 3.1415926 class LineFinder{private: std::vector<cv::Vec2f> lines; double deltaRho; // 參數坐標系的步長(theta表示與直線垂直的角度) double deltaTheta; int minVote;  // 判斷是直線的最小投票數 public: LineFinder() { deltaRho = 1; deltaTheta = PI / 180; minVote = 80; } void setAccResolution(double dRho, double dTheta) { deltaRho = dRho; deltaTheta = dTheta; } void setMinVote(int minv) { minVote = minv; } // Hough變換檢測直線;rho=1,theta=PI/180參數坐標系里的步長,threshold=最小投票數 void findLines(cv::Mat& binary){ lines.clear(); cv::HoughLines(binary, lines, deltaRho, deltaTheta, minVote); }  void drawDetectedLines(cv::Mat& result){ std::vector<cv::Vec2f>::const_iterator it = lines.begin(); while (it != lines.end()) { // 以下兩個參數用來檢測直線屬于垂直線還是水平線 float rho = (*it)[0]; float theta = (*it)[1]; if (theta < PI / 4. || theta > 3.*PI / 4.) { // 若檢測為垂直線,直線交于圖片的上下兩邊,先找交點 cv::Point pt1(rho / cos(theta), 0); cv::Point pt2((rho - result.rows*sin(theta)) / cos(theta), result.rows); cv::line(result, pt1, pt2, cv::Scalar(255), 1); // } else // 若檢測為水平線,直線交于圖片的左右兩邊,先找交點 { cv::Point pt1(0, rho / sin(theta)); cv::Point pt2(result.cols, (rho - result.cols*cos(theta)) / sin(theta)); cv::line(result, pt1, pt2, cv::Scalar(255), 1); } ++it; } }}; int main(int argc, char *argv[]){ cv::Mat image = cv::imread("D:/VS_exercise/images/road1.jpg"); cv::Mat imageGray; cv::Mat contours; cv::cvtColor(image, imageGray, cv::COLOR_RGB2GRAY); cv::Canny(imageGray, contours, 190, 300); // 在原圖的拷貝上畫直線 cv::Mat result(contours.rows, contours.cols, CV_8U, cv::Scalar(255)); image.copyTo(result); // Hough變換檢測 LineFinder finder; finder.setMinVote(130); finder.findLines(contours); finder.drawDetectedLines(result);  // 顯示 cv::namedWindow("Detected Lines with Hough"); cv::imshow("Detected Lines with Hough", result); cv::waitKey(0); return 0;}

OpenCV,霍夫變換,直線檢測

概率Hough變換檢測線段:

霍夫變換檢測直線的目的,是找到二值圖像中經過足夠多數量點的所有直線,當同一直線穿過許多點,便意味著這條線的存在足夠明顯。

概率霍夫變換在原算法的基礎上增加了一些改動,主要是:

1. 不再系統地逐行掃描圖像,而是隨機挑選(輪廓圖像的)前景點,一旦累加器中的某一項交點的票數達到給定的最小值,就搜索輪廓圖像在對應直線上的前景點,連成線段(要小于maxLineGap),然后記錄線段參數(起終點),最后刪除所有經過的點(即使它們并未投過票)。

2. 概率霍夫變換定義了兩個額外的參數:一個是可以接受的最小線段長度(minLineLength),另一個是允許組成連續線段的最大像素間隔(maxLineGap),雖然額外步驟增加了算法的復雜度,但由于參與投票的點數有所減少,因此得到了一些補償。

openCV中的概率霍夫變換直線檢測函數 cv::HoughLinesP:

函數的輸出是cv::Vec4i組成的向量,每個元素是檢測到的線段的兩個坐標點(pt1x, pt1y, pt2x, pt2y)。

#include "opencv2/highgui.hpp"#include "opencv2/core.hpp"#include "opencv2/imgproc.hpp" #define PI 3.1415926  class LineFinder{private: std::vector<cv::Vec4i> lines; double deltaRho; // 步長(theta表示與直線垂直的角度) double deltaTheta; int minVote;  // 判斷是直線的最小投票數  double minLength; // 判斷是直線的最小線段長度  double maxGap; // 允許組成連續線段的最大像素間隔public: LineFinder() { deltaRho = 1; deltaTheta = PI / 180; minVote = 10; minLength = 0.0; maxGap = 0.0; } void setAccResolution(double dRho, double dTheta) { deltaRho = dRho; deltaTheta = dTheta; } void setMinVote(int minv) { minVote = minv; } void setLineLengthAndGap(double length, double gap) { minLength = length; maxGap = gap; }  // Hough變換檢測線段 void findLines(cv::Mat& binary) { lines.clear(); cv::HoughLinesP(binary, lines, deltaRho, deltaTheta, minVote, minLength, maxGap); }  void drawDetectedLines(cv::Mat &image, cv::Scalar color = cv::Scalar(255)) { std::vector<cv::Vec4i>::const_iterator it2 = lines.begin(); while (it2 != lines.end()) { cv::Point pt1((*it2)[0], (*it2)[1]); cv::Point pt2((*it2)[2], (*it2)[3]); cv::line(image, pt1, pt2, color, 1.5); //畫線段 ++it2; } }}; int main(int argc, char *argv[]){ cv::Mat image = cv::imread("D:/VS_exercise/images/road1.jpg"); cv::Mat imageGray; cv::Mat contours; cv::cvtColor(image, imageGray, cv::COLOR_RGB2GRAY); // 邊緣檢測 cv::Canny(imageGray, contours, 190, 300); // Hough變換檢測 LineFinder finder; finder.setMinVote(80); finder.setLineLengthAndGap(100, 10); //概率Hough變換增加的兩個參數 finder.findLines(contours); finder.drawDetectedLines(image);  // 顯示 cv::imshow("Detected Lines with Hough", image); cv::waitKey(0); return 0;}

OpenCV,霍夫變換,直線檢測

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩丝袜精品一区| 日韩激情片免费| 亚洲国产古装精品网站| 欧美日韩免费一区| 成人福利网站在线观看| 精品久久久精品| 中文字幕日韩av电影| 欧美高清视频免费观看| 亚洲sss综合天堂久久| 久久av在线看| 九九热在线精品视频| 久久国内精品一国内精品| 欧美黄色片视频| 亚洲欧美中文字幕| 中文国产亚洲喷潮| 色七七影院综合| 亚洲成人免费网站| 欧美尺度大的性做爰视频| 午夜欧美不卡精品aaaaa| 日韩av在线资源| 国产99久久精品一区二区| 欧美—级高清免费播放| 日韩精品亚洲视频| 欧美国产日韩一区二区在线观看| 国产欧美精品一区二区三区-老狼| 国产精品免费视频久久久| 久久国产色av| 国产精品亚洲第一区| 欧美一区二区三区精品电影| 欧美成人免费一级人片100| 欧美成人激情视频| 欧美激情性做爰免费视频| 欧美日韩成人黄色| 国产日韩欧美一二三区| 日韩高清欧美高清| 91理论片午午论夜理片久久| 国产乱肥老妇国产一区二| 欧美一区二区三区免费观看| 亚洲黄一区二区| 国产精品青草久久久久福利99| 国产精品高潮呻吟久久av黑人| 欧美激情视频免费观看| 国产91免费看片| 国产精品a久久久久久| 亚洲精品xxx| 最近2019免费中文字幕视频三| 国产精品影院在线观看| 精品成人av一区| 91精品啪aⅴ在线观看国产| 亚洲精品电影网在线观看| 日本免费在线精品| 亚洲码在线观看| 九九久久久久99精品| 亚洲综合小说区| 午夜精品一区二区三区在线视频| 日本欧美黄网站| 亚洲电影免费观看高清完整版| 中文字幕在线看视频国产欧美在线看完整| 欧美大尺度电影在线观看| 国产精品扒开腿做| 国产精品69久久| 亚洲一区二区三区视频| 亚洲欧洲日产国产网站| 欧美专区在线播放| 日韩美女免费视频| 91青草视频久久| 久久久久久午夜| 欧美国产高跟鞋裸体秀xxxhd| 日韩久久午夜影院| 欧美大片在线看免费观看| 91精品国产色综合久久不卡98口| 久久久久久久久综合| 91在线观看免费网站| 97人人爽人人喊人人模波多| 久久艳片www.17c.com| 91中文字幕在线观看| 亚洲天堂开心观看| 欧美性xxxxx极品娇小| 日韩中文字幕av| 亚洲成人三级在线| 亚洲欧美国产精品| 日韩中文字幕av| 色综合久久天天综线观看| 日韩大陆毛片av| 国产精品久久9| 欧美精品18videosex性欧美| 国产欧美亚洲精品| 一区二区三区视频免费| 亚洲欧洲日产国产网站| 日韩精品一二三四区| 国产精品一区二区三区毛片淫片| 久久精品国产亚洲精品2020| 91色在线视频| 亚洲欧美日韩另类| 欧美精品电影免费在线观看| 亚洲国产欧美在线成人app| 国产精品网站视频| 欧美激情第1页| 米奇精品一区二区三区在线观看| 影音先锋欧美在线资源| 黄色一区二区在线| 在线成人激情视频| 日本最新高清不卡中文字幕| 91免费综合在线| 欧美黄色片在线观看| 亚洲精品福利免费在线观看| 亚洲男人的天堂在线| 亚洲毛片在线免费观看| 日韩av在线精品| 久久精品国产欧美激情| 日韩欧中文字幕| 狠狠色狠色综合曰曰| 俺去亚洲欧洲欧美日韩| 久久大大胆人体| 国产精品麻豆va在线播放| 韩剧1988在线观看免费完整版| 狠狠躁夜夜躁人人躁婷婷91| 国产亚洲欧美日韩一区二区| 国产精品成人aaaaa网站| 亚洲自拍高清视频网站| 日产精品久久久一区二区福利| 国产精品久久久久久av福利软件| 日韩精品极品在线观看| 国产大片精品免费永久看nba| 66m—66摸成人免费视频| 第一福利永久视频精品| 在线激情影院一区| 欧美性20hd另类| 亚洲一区二区久久久久久久| 日韩精品亚洲精品| 欧美中文字幕第一页| 欧美激情区在线播放| 亚洲美女精品久久| 国产精品99久久久久久白浆小说| 国产www精品| 色婷婷亚洲mv天堂mv在影片| 国产在线观看91精品一区| 久久久免费av| 成人www视频在线观看| 欧美理论片在线观看| 欧美视频在线观看 亚洲欧| 久久伊人91精品综合网站| 91精品国产综合久久久久久蜜臀| 日韩经典一区二区三区| 午夜欧美大片免费观看| 最近2019年日本中文免费字幕| www.日韩免费| 久久久久久久久国产| 久久久精品在线| 精品国产31久久久久久| 国产成人精品最新| 91精品视频播放| 8x海外华人永久免费日韩内陆视频| 久久视频在线直播| 黑人极品videos精品欧美裸| 国产精品精品视频一区二区三区| 九九热精品视频国产| 疯狂蹂躏欧美一区二区精品| 国产免费观看久久黄| 亚洲欧美制服中文字幕| 国产伦精品一区二区三区精品视频| 久久久天堂国产精品女人| 黑人精品xxx一区| 亚洲天堂免费观看|