Opencv——霍夫變換以及遇到的一些問題

目錄

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

問題1 :顏色空間轉換函數參數問題:CV_BGR2GRAY vs CV_GRAY2BGR

OpenCV的顏色空間轉換函數:

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

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

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

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

霍夫變換的含義

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

標準霍夫直線變換

霍夫線變換函數參數講解

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

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

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#define WINDOW_NAME "【程序窗口】"			//為窗口標題定義的宏using namespace cv;
using namespace std;
//==================================標準霍夫變換============================================
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);//進行一此canny邊緣檢測  //【3】進行霍夫線變換  vector<Vec2f> lines;//定義一個矢量結構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 )

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

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

//==================================累計概率霍夫變換============================================
int main()
{//讀取原圖片Mat Image = imread("D:\\opencv_picture_test\\霍夫變換.png");//顯示原圖片namedWindow("【原圖】");imshow("【原圖】", Image);Mat srcImage = Image.clone();Mat midImage, dstImage;//進行邊緣檢測和轉化為將灰度圖轉為RGB圖Canny(srcImage, midImage, 50, 200, 3);cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//定義矢量結構lines用于存放得到的線段矢量集合vector<Vec4i> lines;//進行霍夫變換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;
}

霍夫變換圓變換

原理和算法步驟:

原理和算法步驟

霍夫圓變換函數參數講解

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


==================================霍夫變換圓變換============================================int main()
{//載入原始圖和Mat變量定義     Mat srcImage = imread("D:\\opencv_picture_test\\形態學操作\\孔洞.png");Mat midImage, dstImage;//顯示原始圖  imshow("【原始圖】", srcImage);//轉為灰度圖,進行圖像平滑  cvtColor(srcImage, midImage, COLOR_BGR2GRAY);//轉化邊緣檢測后的圖為灰度圖  GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);		//模糊去噪//進行霍夫圓變換  vector<Vec3f> circles;		//圓存儲器,存儲圓的數量,圓心坐標和半徑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;
}

霍夫變換總結

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

參考鏈接

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
淺墨大神博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378650.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java ssm如何上傳圖片_ssm整合-圖片上傳功能(轉)

本文介紹 ssm (SpringSpringMVCMybatis)實現上傳功能。以一個添加用戶的案例介紹(主要是將上傳文件)。一、需求介紹我們要實現添加用戶的時候上傳圖片(其實任何文件都可以)。文件名&#xff1a;以 博客名日期的年月日時分秒毫秒形式命名如 言曌博客2017082516403213.png路徑&am…

宏定義和內聯函數區別

內聯函數是代碼被插入到調用者代碼處的函數。如同 #define 宏&#xff0c;內聯函數通過避免被調用的開銷來提高執行效率&#xff0c;尤其是它能夠通過調用&#xff08;“過程化集成”&#xff09;被編譯器優化。 宏定義不檢查函數參數&#xff0c;返回值什么的&#xff0c;只是…

24-光流估計

光流是空間運動物體在觀測成像平面上的像素運動的“瞬間速度”&#xff0c;根據各個像素點的速度矢量特征&#xff0c;可以對圖像進行動態分析&#xff0c;例如目標跟蹤 亮度恒定&#xff1a;同一點隨著時間的變化&#xff0c;其亮度不會發生改變 小運動&#xff1a;隨著時間的…

java公平索非公平鎖_java中的非公平鎖不怕有的線程一直得不到執行嗎

首先來看公平鎖和非公平鎖&#xff0c;我們默認使用的鎖是非公平鎖&#xff0c;只有當我們顯示設置為公平鎖的情況下&#xff0c;才會使用公平鎖&#xff0c;下面我們簡單看一下公平鎖的源碼&#xff0c;如果等待隊列中沒有節點在等待&#xff0c;則占有鎖&#xff0c;如果已經…

mybatis.net - 5 嵌入資源與引用資源

在SqlMap.config文件中可以有兩種方式引入外部的文件。 一種是通過資源的方式&#xff0c;在文件中表現為 resource&#xff0c;就是引用外部的文件&#xff0c;這里需要保證文件的路徑正確。 <sqlMaps><sqlMap resource"Maps/ProductMap.xml"/><sqlM…

智能車復工日記【3】:圖像處理——基本掃線和基本特征提取和十字補線

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 目錄 1、系列文章2、前言3、基本掃線(除了進入環島狀態或者坡道或者十字路口的普通掃線)1.基本數據和初步特征4、進一步特征…

short 用equals_Java Short類equals()方法的示例

short 用equals短類equals()方法 (Short class equals() method) equals() method is available in java.lang package. equals()方法在java.lang包中可用。 equals() method is used to check equality or inequality of this Object against the given Object or in other wo…

圖解MySQL數據庫的陳列和把持-4

泉源&#xff1a;網海拾貝 填入一些測試數據&#xff1a; 封閉“MySQL Query Browser”&#xff0c;再從頭翻開它&#xff0c;切換到testtable表&#xff0c;看到了沒有&#xff1f;剛剛輸出的中文變成了“&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&am…

非常好友(C++)

Bessie和其他的所有奶牛的耳朵上都戴有一個射頻識別&#xff08;RFID&#xff09;序列號碼牌。因此農夫John可以機械化地計算他們的數量。很多奶牛都有一個“牛友”。如果奶牛A的序列號的約數之和剛好等于奶牛B的序列號&#xff0c;那么A的牛友就是B。在這里&#xff0c;一個數…

智能車復工日記【2】——普通PID、變結構PID、微分先行PID、模糊PID、專家PID

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 目錄 系列文章前言普通PID舵機參數:電機參數:變結構PI控制(電機控制,這里對公式進行修改采用正態分布公式)微分先行PID(…

爬動的蠕蟲(C++)

問題描述&#xff1a; 一條蟲子在n英寸深的井底&#xff0c;每次一分鐘爬行u英寸&#xff0c;但是它再次爬行前必須先休息1分鐘&#xff0c;在休息過程中它將滑落d英寸&#xff0c;在反復向上爬行和休息后&#xff0c;多長時間蟲子能爬出這口井&#xff1f;在此過程中&#xf…

使用快捷鍵,快到極致

前段時間曾經寫過一篇文章&#xff0c;《優秀程序員無他-善假于物也》。其中談到一點是優秀的程序員必須要能靈活的掌握常用軟件的快捷鍵。對于程序員來說&#xff0c;每天使用時間最長的軟件恐怕就是IDE&#xff08;Integrated Development Environment&#xff09;了。如果你…

java反射對象賦值_Java反射詳解

反射(Reflection)能夠讓運行于 JVM 中的程序檢測和修改運行時的行為。Class類提供了以下方法四個public方法&#xff0c;用于獲取某個類的構造方法&#xff1a;Constructor getConstructor(Class[] params)// 根據構造函數的參數&#xff0c;返回一個具體的具有public屬性的構造…

Oracle裝置后果

來歷&#xff1a;網海拾貝 本日未來誥日裝置Oracle后&#xff0c;出現了兩個后果。 經過過程SQL Plus不竭無法連接長途數據庫&#xff0c;提醒錯誤ORA-12514:TNS:監聽過程不能解析在連接描繪符中給出的SERVICE_NAME。 厥后締造用可視化的Net Configuration Assistant東西對監聽…

Java Hashtable hashCode()方法及示例

Hashtable類hashCode()方法 (Hashtable Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to return the hash code value for this object in this Hashtable. hashCode()方法…

C---蟬、蜻蜓、蜘蛛

【問題描述】 已知 腿/條翅膀/對蟬61蜻蜓62蜘蛛80 現有小蟲n只&#xff0c;共有X條腿和Y對翅膀&#xff0c;問蟬、蜻蜓、蜘蛛各有多少只&#xff1f;請使用循環的知識解決&#xff0c;數據確保有解。 【輸入形式】三個用空格隔開的整數&#xff0c;依次為n、X、Y 【輸出形式】…

輪廓(查找和繪制輪廓、輪廓的表達與組織、輪廓的特性)

目錄1、輪廓的定義2、如何在圖像中找到輪廓opencv自帶的查找輪廓函數:findContours()3、輪廓的表達方式1.頂點的序列2.Freeman鏈碼4、輪廓之間的組織方式5、輪廓的特點&#xff08;這部分可以展開來詳細探討&#xff0c;這里不做過多解釋&#xff09;6、輪廓的匹配7、繪制輪廓d…

python如何操作oracle數據庫_python操作oracle數據庫

搜索熱詞下面是編程之家 jb51.cc 通過網絡收集整理的代碼片段。編程之家小編現在分享給大家&#xff0c;也給大家做個參考。# -*- mode: python; coding: utf-8 -*-## python operate oracle,contain insert、delete、update、select.## author liyulin# date 2014-11-07import…

可能用得上的jquery 插件

Chosen (github) 是一個強大的增強下拉選擇框的插件&#xff0c;支持自定義css樣式。同時你可以使用ajax增加一些回調函數&#xff0c;插件會給hidden input復制&#xff0c;這樣你可以在提交表單的時候獲得正確的值。 Turn.js 是一個 JavaScript 庫&#xff0c;使您的網頁內容…

草根創業回憶錄二: 都選擇的是什么人?

草根創業回憶錄二: 都選擇的是什么人&#xff1f; 前言&#xff1a;選合伙人和投資就像在選女朋友一樣&#xff0c;要謹慎&#xff0c;甚至有時候寧缺毋濫。 曾經以為有了錢&#xff0c;就會找到需要的人&#xff0c;后來發現不是這樣的。 也以為&#xff0c;隨便拉幾個關系好的…