日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Opencv——霍夫变换以及遇到的一些问题

發(fā)布時間:2023/12/1 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Opencv——霍夫变换以及遇到的一些问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

    • 問題1 :顏色空間轉(zhuǎn)換函數(shù)參數(shù)問題:CV_BGR2GRAY vs CV_GRAY2BGR
    • 問題2:cvRound()、cvFloor()、cvCeil()函數(shù)用法
    • 霍夫變換的含義
    • 標(biāo)準(zhǔn)霍夫直線變換
      • 霍夫線變換函數(shù)參數(shù)講解
    • 累計概率霍夫變換
    • 霍夫變換圓變換
      • 原理和算法步驟:
      • 霍夫圓變換函數(shù)參數(shù)講解
    • 霍夫變換總結(jié)
    • 參考鏈接

問題1 :顏色空間轉(zhuǎn)換函數(shù)參數(shù)問題:CV_BGR2GRAY vs CV_GRAY2BGR

OpenCV的顏色空間轉(zhuǎn)換函數(shù):

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )

dstCn現(xiàn)在已經(jīng)改成COLOR_GRAY2BGR之類的以COLOR開頭的。
CV_BGR2GRAY :將RGB圖轉(zhuǎn)換成GRAY圖
CV_GRAY2BGR:將GRAY圖轉(zhuǎn)換成RGB圖
淺墨源碼
cvtColor(midImage, dstImage, COLOR_GRAY2BGR);
//將canny算子掃描后的二值圖轉(zhuǎn)化為RGB圖,原因是后面你可視化霍夫變換效果時,畫的曲線是彩色的。

問題2:cvRound()、cvFloor()、cvCeil()函數(shù)用法

cvRound():返回跟參數(shù)最接近的整數(shù)值,即四舍五入;
cvFloor():返回不大于參數(shù)的最大整數(shù)值,即向下取整;
cvCeil():返回不小于參數(shù)的最小整數(shù)值,即向上取整;

霍夫變換的含義

這個我在邊緣的文章中有涉及過,直接貼鏈接:
https://blog.csdn.net/qq_42604176/article/details/104300287
還有我參考的一個鏈接:
https://blog.csdn.net/yuyuntan/article/details/80141392

標(biāo)準(zhǔn)霍夫直線變換

霍夫線變換函數(shù)參數(shù)講解

●第一個參數(shù),InputArray類型的image, 輸入圖像,即源圖像。需為8位的單通道二進(jìn)制圖像
●第二個參數(shù),InputArray類型的lines,經(jīng)過調(diào)用HoughLines函數(shù)后儲存了霍 夫線變換檢測到線條的輸出矢量。每一條線由具有兩個元素的矢量( ρ, 0) 表示,其中,ρ是離坐標(biāo)原點(0,0) (也就是圖像的左上角)的距離,θ是弧度線條旋轉(zhuǎn)角度(0度表示垂直線,π/2 度表示水平線)。
●第三個參數(shù),double類型的rho,以像素為單位的距離精度。另-種表述方
式是直線搜索時的進(jìn)步尺寸的單位半徑。(Latex 中/rho即表示ρ )
●第四個參數(shù),double 類型的theta,
以弧度為單位的角度精度。另一種表述 方式是直線搜索時的進(jìn)步尺寸的單位角度。
●第五個參數(shù),int類型的threshold,累加平面的閾值參數(shù),即識別某部分為 圖中的一條直線時它在累加平面中必須達(dá)到的值。大于國值threshold的線段才可以被檢測通過并返回到結(jié)果中。
●第六個參數(shù),double類型的srn,, 有默認(rèn)值0。對于多尺度的霍夫變換,這 是第三個參數(shù)進(jìn)步尺寸rho的除數(shù)距離。粗略的累加器進(jìn)步尺寸直接是第三個參數(shù)rho,而精確的累加器進(jìn)步尺寸為rho/sm。
●第七個參數(shù),double 類型的stn, 有默認(rèn)值0,對于多尺度霍夫變換,sm表示第四個參數(shù)進(jìn)步尺寸的單位角度theta的除數(shù)距離。且如果sr和 stn同時為0,就表示使用經(jīng)典的霍夫變換。否則,這兩個參數(shù)應(yīng)該都為正數(shù)。

理解:在XY平面,直線有兩個參數(shù):K、B(斜率和截距),可視化直線,需要構(gòu)造x,y軸,假設(shè)XY軸的最小精度為1,則勾畫出的直線其實是一系列離散的點。隨著XY精度升高,所可視化出來的數(shù)據(jù)將越來越像一條線。
同理,在rho/theta平面,一條直線對應(yīng)平面上以rho為橫坐標(biāo),tehta為縱坐標(biāo)的一個點。
rho/theta的精度越高,所表示的直線越精準(zhǔn)。我想這邊是第三參數(shù)和第四參數(shù)的含義。
我們一般以rho=1,theta=1度的精度來構(gòu)造投票空間。

#include <opencv2/opencv.hpp> #include <iostream> #include "windows.h" #include <stdio.h> #define WINDOW_NAME "【程序窗口】" //為窗口標(biāo)題定義的宏using namespace cv; using namespace std; //==================================標(biāo)準(zhǔn)霍夫變換============================================ int main() {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); //字體為綠色Mat srcImage = imread("D:\\opencv_picture_test\\霍夫變換.png");//判斷圖像是否加載成功if (srcImage.empty()){cout << "圖像加載失敗!" << endl;return -1;}elsecout << "圖像加載成功!" << endl << endl;Mat midImage,dstImage;Canny(srcImage, midImage, 50, 200, 3);//進(jìn)行一此canny邊緣檢測 //【3】進(jìn)行霍夫線變換 vector<Vec2f> lines;//定義一個矢量結(jié)構(gòu)lines用于存放得到的線段矢量集合 HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0);//【4】依次在圖中繪制出每條線段 for (size_t i = 0; i < lines.size(); i++){float rho = lines[i][0], theta = lines[i][1];Point pt1, pt2;double a = cos(theta), b = sin(theta);double x0 = a * rho, y0 = b * rho;pt1.x = cvRound(x0 + 1000 * (-b)); pt1.y = cvRound(y0 + 1000 * (a));pt2.x = cvRound(x0 - 1000 * (-b));pt2.y = cvRound(y0 - 1000 * (a));line(midImage, pt1, pt2, Scalar(255,255,255),1, LINE_AA);}//【5】顯示原始圖 imshow("【原始圖】", srcImage);//【6】邊緣檢測后的圖 imshow("【邊緣檢測后的圖】", midImage);//【7】顯示效果圖 //imshow("【效果圖】", dstImage);waitKey(0);return 0; }

累計概率霍夫變換

C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )

第一個參數(shù),InputArray類型的image,輸入圖像,即源圖像,需為8位的單通道二進(jìn)制圖像,可以將任意的源圖載入進(jìn)來后由函數(shù)修改成此格式后,再填在這里。
第二個參數(shù),InputArray類型的lines,經(jīng)過調(diào)用HoughLinesP函數(shù)后后存儲了檢測到的線條的輸出矢量,每一條線由具有四個元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每個檢測到的線段的結(jié)束點。
第三個參數(shù),double類型的rho,以像素為單位的距離精度。另一種形容方式是直線搜索時的進(jìn)步尺寸的單位半徑。
第四個參數(shù),double類型的theta,以弧度為單位的角度精度。另一種形容方式是直線搜索時的進(jìn)步尺寸的單位角度。
第五個參數(shù),int類型的threshold,累加平面的閾值參數(shù),即識別某部分為圖中的一條直線時它在累加平面中必須達(dá)到的值。大于閾值threshold的線段才可以被檢測通過并返回到結(jié)果中。
第六個參數(shù),double類型的minLineLength,有默認(rèn)值0,表示最低線段的長度,比這個設(shè)定參數(shù)短的線段就不能被顯現(xiàn)出來。
第七個參數(shù),double類型的maxLineGap,有默認(rèn)值0,允許將同一行點與點之間連接起來的最大的距離。

通過設(shè)定直線長度閾值,對過長或過短的直線不予理會。

//==================================累計概率霍夫變換============================================ int main() {//讀取原圖片Mat Image = imread("D:\\opencv_picture_test\\霍夫變換.png");//顯示原圖片namedWindow("【原圖】");imshow("【原圖】", Image);Mat srcImage = Image.clone();Mat midImage, dstImage;//進(jìn)行邊緣檢測和轉(zhuǎn)化為將灰度圖轉(zhuǎn)為RGB圖Canny(srcImage, midImage, 50, 200, 3);cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//定義矢量結(jié)構(gòu)lines用于存放得到的線段矢量集合vector<Vec4i> lines;//進(jìn)行霍夫變換HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);//依次在圖中繪制每條線段for (size_t i = 0;i < lines.size();i++) {Vec4i l = lines[i];line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 1, LINE_AA);}imshow("【邊緣檢測后的圖】", midImage);imshow("【效果圖】", dstImage);waitKey(0);return 0; }

霍夫變換圓變換

原理和算法步驟:

霍夫圓變換函數(shù)參數(shù)講解

cvHoughCircles( CvArr* image, void* circle_storage, int method, double dp, double min_dist, double param1=100, double param2=100, int min_radius=0, int max_radius=0 );

輸入:輸入 8-bit、單通道灰度圖像. circle_storage:檢測到的圓存儲倉. 可以是內(nèi)存存儲倉 (此種情況下,一個線段序列在存儲倉中被創(chuàng)建,并且由函數(shù)返回)或者是包含圓參數(shù)的特殊類型的具有單行/單列的CV_32FC3型矩陣(CvMat*).矩陣頭為函數(shù)所修改,使得它的 cols/rows 將包含一組檢測到的圓。如果 circle_storage是矩陣,而實際圓的數(shù)目超過矩陣尺寸,那么最大可能數(shù)目的圓被返回。 每個圓由三個浮點數(shù)表示:圓心坐標(biāo)(x,y)和半徑.
method:Hough 變換方式,目前 只支持HOUGH_GRADIENT
dp:累加器圖像的分辨率。這個參數(shù)允許創(chuàng)建一個比輸入圖像分辨率低的累加器。(這樣做是因為有理由認(rèn)為圖像中存在的圓會自然降低到與圖像寬高相同數(shù)量的范疇)。如果dp設(shè)置為1,則分辨率是相同的;如果設(shè)置為更大的值(比如2),累加器的分辨率受此影響會變小(此情況下為一半)。dp的值不能比1小。
min_dist:該參數(shù)是讓算法能明顯區(qū)分的兩個不同圓之間的最小距離。
param1:用于Canny的邊緣閥值上限,下限被置為上限的一半。
param2:累加器的閥值。
min_radius:最小圓半徑。
max_radius:最大圓半徑。

==================================霍夫變換圓變換============================================int main() {//載入原始圖和Mat變量定義 Mat srcImage = imread("D:\\opencv_picture_test\\形態(tài)學(xué)操作\\孔洞.png");Mat midImage, dstImage;//顯示原始圖 imshow("【原始圖】", srcImage);//轉(zhuǎn)為灰度圖,進(jìn)行圖像平滑 cvtColor(srcImage, midImage, COLOR_BGR2GRAY);//轉(zhuǎn)化邊緣檢測后的圖為灰度圖 GaussianBlur(midImage, midImage, Size(9, 9), 2, 2); //模糊去噪//進(jìn)行霍夫圓變換 vector<Vec3f> circles; //圓存儲器,存儲圓的數(shù)量,圓心坐標(biāo)和半徑HoughCircles(midImage, circles,HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);//inputImage circle_storage 霍夫變換的方式 累加器圖像的分辨率 兩個不同圓之間的距離 //依次在圖中繪制出圓 for (size_t i = 0; i < circles.size(); i++){Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));int radius = cvRound(circles[i][2]);//繪制圓心 circle(srcImage, center, 3, Scalar(0, 0, 255), 3, 8, 0);//繪制圓輪廓 circle(srcImage, center, radius, Scalar(0, 0, 255), 3, 8, 0);}//顯示效果圖 imshow("【效果圖】", srcImage);while ((char)waitKey(1) != 'q') {}return 0; }

霍夫變換總結(jié)

1、為什么在霍夫變換求直線方程時,要用極坐標(biāo)的形式
斜截式不能表示垂直于x軸的直線,而極坐標(biāo)形式可以表達(dá)。
2、霍夫變換求直線方程,和使用最小二乘法求直線最小方程相比,有什么優(yōu)缺點
優(yōu)點:當(dāng)出現(xiàn)離群采樣點時最小二乘法會有很大誤差而霍夫變換不會
缺點:時間復(fù)雜度和空間復(fù)雜度都很高,只能檢測線段的方向,而不能確定線段的長度

參考鏈接

https://blog.csdn.net/timidsmile/article/details/9342855

https://blog.csdn.net/OliverkingLi/article/details/54754814?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158565498519724835852132%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158565498519724835852132&biz_id=0&utm_source=distribute.pc_search_result.none-task

http://www.manongjc.com/article/42132.html
https://stackoverflow.com/questions/5929125/opencv-houghcircles-param1-param2
https://blog.csdn.net/yuyuntan/article/details/80141392
淺墨大神博客

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Opencv——霍夫变换以及遇到的一些问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。