OpenCV實(shí)現(xiàn)直線檢測
本文實(shí)例為大家分享了OpenCV實(shí)現(xiàn)直線檢測的具體代碼,供大家參考,具體內(nèi)容如下
1 介紹
本文主要介紹OpenCV自帶的直線檢測函數(shù)HoughLines()的用法,這個(gè)函數(shù)的第一個(gè)參數(shù)是一個(gè)二值化圖像,所以在進(jìn)行霍夫變換之前要首先進(jìn)行二值化,或者進(jìn)行Canny 邊緣檢測。第二和第三個(gè)值分別代表β 和 θ 的精確度。第四個(gè)參數(shù)是閾值,只有累加其中的值高于閾值時(shí)才被認(rèn)為是一條直線,也可以把它看成能檢測到的直線的最短長度(以像素點(diǎn)為單位)。返回值就是(β; θ)。β 的單位是像素,θ的單位是弧度。
2 代碼
#直線檢測 #使用霍夫直線變換做直線檢測,前提條件:邊緣檢測已經(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 效果
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的實(shí)現(xiàn)
這篇文章主要介紹了OpenCV里的imshow()和Matplotlib.pyplot的imshow()的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置
這篇文章主要介紹了Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02解決Jupyter NoteBook輸出的圖表太小看不清問題
這篇文章主要介紹了解決Jupyter NoteBook輸出的圖表太小看不清問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04OpenCV實(shí)現(xiàn)從灰度圖像切出Mask前景區(qū)域
本文主要介紹了如何利用OpenCV實(shí)現(xiàn)從灰度圖像,根據(jù)閾值,切出多個(gè)前景區(qū)域,過濾面積太小的圖像。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06基于python實(shí)現(xiàn)檢索標(biāo)記敏感詞并輸出
這篇文章主要介紹了基于python實(shí)現(xiàn)檢索敏感詞并輸出,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05深入解析Python中BeautifulSoup4的基礎(chǔ)知識(shí)與實(shí)戰(zhàn)應(yīng)用
BeautifulSoup4正是一款功能強(qiáng)大的解析器,能夠輕松解析HTML和XML文檔,本文將介紹BeautifulSoup4的基礎(chǔ)知識(shí),并通過實(shí)際代碼示例進(jìn)行演示,感興趣的可以了解下2024-02-02Anaconda下Python中h5py與netCDF4模塊下載與安裝的教程詳解
這篇文章主要為大家詳細(xì)介紹了基于Anaconda,下載并安裝Python中h5py與netCDF4這兩個(gè)模塊的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01