OpenCV實現直線檢測
本文實例為大傢分享瞭OpenCV實現直線檢測的具體代碼,供大傢參考,具體內容如下
1 介紹
本文主要介紹OpenCV自帶的直線檢測函數HoughLines()的用法,這個函數的第一個參數是一個二值化圖像,所以在進行霍夫變換之前要首先進行二值化,或者進行Canny 邊緣檢測。第二和第三個值分別代表β 和 θ 的精確度。第四個參數是閾值,隻有累加其中的值高於閾值時才被認為是一條直線,也可以把它看成能檢測到的直線的最短長度(以像素點為單位)。返回值就是(β; θ)。β 的單位是像素,θ的單位是弧度。
2 代碼
#直線檢測 #使用霍夫直線變換做直線檢測,前提條件:邊緣檢測已經完成 import cv2 as cv import numpy as np import matplotlib.pylab as plt #標準霍夫線變換 def line_detection(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) #apertureSize參數默認其實就是3 cv.imshow("edges", edges) lines = cv.HoughLines(edges, 1, np.pi/180, 80) for line in lines: rho, theta = line[0] #line[0]存儲的是點到直線的極徑和極角,其中極角是弧度表示的。 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)) #計算直線起點橫坐標 y1 = int(y0 + 1000 * a) #計算起始起點縱坐標 x2 = int(x0 - 1000 * (-b)) #計算直線終點橫坐標 y2 = int(y0 - 1000 * a) #計算直線終點縱坐標 註:這裡的數值1000給出瞭畫出的線段長度范圍大小,數值越小,畫出的線段越短,數值越大,畫出的線段越長 cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #點的坐標必須是元組,不能是列表。 cv.imshow("image-lines", image) #統計概率霍夫線變換 def line_detect_possible_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize參數默認其實就是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') #調用上一個函數後,會把傳入的src數組改變,所以調用下一個函數時,要重新讀取圖片 line_detect_possible_demo(src) cv.waitKey(0) cv.destroyAllWindows()
3 效果
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Python OpenCV Hough直線檢測算法的原理實現
- opencv python 對指針儀表讀數識別的兩種方式
- Python OpenCV 圖像矯正的原理實現
- Python實現Opencv cv2.Canny()邊緣檢測
- python opencv實現直線檢測並測出傾斜角度(附源碼+註釋)