1 介紹
本文主要介紹OpenCV自帶的直線檢測(cè)函數(shù)HoughLines()的用法,這個(gè)函數(shù)的第一個(gè)參數(shù)是一個(gè)二值化圖像,所以在進(jìn)行霍夫變換之前要首先進(jìn)行二值化,或者進(jìn)行Canny 邊緣檢測(cè)。第二和第三個(gè)值分別代表β 和 θ 的精確度。第四個(gè)參數(shù)是閾值,只有累加其中的值高于閾值時(shí)才被認(rèn)為是一條直線,也可以把它看成能檢測(cè)到的直線的最短長度(以像素點(diǎn)為單位)。返回值就是(β; θ)。β 的單位是像素,θ的單位是弧度。
2 代碼
#直線檢測(cè)
#使用霍夫直線變換做直線檢測(cè),前提條件:邊緣檢測(cè)已經(jīng)完成
import cv2 as cv
import numpy as np
import matplotlib.pylab as plt
#標(biāo)準(zhǔn)霍夫線變換
def line_detection(image):
gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
edges = cv.Canny(gray, 50, 150, apertureSize=3) #apertureSize參數(shù)默認(rèn)其實(shí)就是3
cv.imshow("edges", edges)
lines = cv.HoughLines(edges, 1, np.pi/180, 80)
for line in lines:
rho, theta = line[0] #line[0]存儲(chǔ)的是點(diǎn)到直線的極徑和極角,其中極角是弧度表示的。
a = np.cos(theta) #theta是弧度
b = np.sin(theta)
x0 = a * rho #代表x = r * cos(theta)
y0 = b * rho #代表y = r * sin(theta)
x1 = int(x0 + 1000 * (-b)) #計(jì)算直線起點(diǎn)橫坐標(biāo)
y1 = int(y0 + 1000 * a) #計(jì)算起始起點(diǎn)縱坐標(biāo)
x2 = int(x0 - 1000 * (-b)) #計(jì)算直線終點(diǎn)橫坐標(biāo)
y2 = int(y0 - 1000 * a) #計(jì)算直線終點(diǎn)縱坐標(biāo) 注:這里的數(shù)值1000給出了畫出的線段長度范圍大小,數(shù)值越小,畫出的線段越短,數(shù)值越大,畫出的線段越長
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #點(diǎn)的坐標(biāo)必須是元組,不能是列表。
cv.imshow("image-lines", image)
#統(tǒng)計(jì)概率霍夫線變換
def line_detect_possible_demo(image):
gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize參數(shù)默認(rèn)其實(shí)就是3
lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5)
for line in lines:
x1, y1, x2, y2 = line[0]
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv.imshow("line_detect_possible_demo",image)
src = cv.imread(r'..\edge.jpg')
print(src.shape)
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
line_detection(src)
src = cv.imread(r'..\edge.jpg') #調(diào)用上一個(gè)函數(shù)后,會(huì)把傳入的src數(shù)組改變,所以調(diào)用下一個(gè)函數(shù)時(shí),要重新讀取圖片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
3、效果
Qt 可以做什么?
Qt 雖然經(jīng)常被當(dāng)做一個(gè) GUI 庫,用來開發(fā)圖形界面應(yīng)用程序,但這并不是 Qt 的全部;Qt 除了可以繪制漂亮的界面(包括控件、布局、交互),還包含很多其它功能,比如多線程、訪問數(shù)據(jù)庫、圖像處理、音頻視頻處理、網(wǎng)絡(luò)通信、文件操作等,這些 Qt 都已經(jīng)內(nèi)置了。
大部分應(yīng)用程序都可以使用 Qt 實(shí)現(xiàn),除了與計(jì)算機(jī)底層結(jié)合特別緊密的,例如驅(qū)動(dòng)開發(fā),它直接使用硬件提供的編程接口,而不能使用操作系統(tǒng)自帶的函數(shù)庫。
下面的程序都使用 Qt 開發(fā):WPS、YY語音、Skype、豆瓣電臺(tái)、蝦米音樂、淘寶助理、千牛、暴雪的戰(zhàn)網(wǎng)客戶端、VirtualBox、Opera、咪咕音樂、Google地圖、Adobe Photoshop Album 等。
Linux 也是嵌入式的主力軍,廣泛應(yīng)用于消費(fèi)類電子、工業(yè)控制、軍工電子、電信/網(wǎng)絡(luò)/通訊、航空航天、汽車電子、醫(yī)療設(shè)備、儀器儀表等相關(guān)行業(yè)。
Qt 雖然也支持手機(jī)操作系統(tǒng),但是由于 Android 本身已經(jīng)有Java和 Kotlin,iOS 本身已經(jīng)有 Objective-C 和 Swift,所以 Qt 在移動(dòng)端的市場(chǎng)份額幾乎可以忽略。
總起來說,Qt 主要用于桌面程序開發(fā)和嵌入式開發(fā)。文章來源:http://www.zghlxwxcb.cn/news/detail-627581.html
本文福利,莬費(fèi)領(lǐng)取Qt開發(fā)學(xué)習(xí)資料包、技術(shù)視頻,內(nèi)容包括(C++語言基礎(chǔ),C++設(shè)計(jì)模式,Qt編程入門,QT信號(hào)與槽機(jī)制,QT界面開發(fā)-圖像繪制,QT網(wǎng)絡(luò),QT數(shù)據(jù)庫編程,QT項(xiàng)目實(shí)戰(zhàn),QSS,OpenCV,Quick模塊,面試題等等)↓↓↓↓↓↓見下面↓↓文章底部點(diǎn)擊莬費(fèi)領(lǐng)取↓↓文章來源地址http://www.zghlxwxcb.cn/news/detail-627581.html
到了這里,關(guān)于OpenCV如何實(shí)現(xiàn)直線檢測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!