一、Opencv霍夫直線檢測需要擬合嗎
Opencv霍夫直線檢測的基本原理是將物體上的曲線或者邊緣進行檢測和提取。在直線的情況下,原理是將直線的參數進行變換,轉換為Hough空間的點,在Hough空間中找出在一定範圍內累計值最高的點,通過反演變換,將Hough空間的點映射回到直線上,從而得到直線參數。
在使用Opencv霍夫直線檢測時,通常得到的是直線的參數,可以直接使用這些參數進行繪製,而不需要擬合。但是,在某些情況下,直線可能不是完整的,可能存在斷點或曲折,這時可以使用擬合的方法將多個線段擬合成一條直線。
下面是一個簡單的例子,演示直接繪製霍夫直線檢測的結果和擬合後的結果:
import cv2 as cv import numpy as np img = cv.imread('image.jpg') gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) edges = cv.Canny(gray,50,150,apertureSize = 3) lines = cv.HoughLines(edges,1,np.pi/180,200) # 直接繪製霍夫直線檢測的結果 for line in lines: rho,theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv.line(img,(x1,y1),(x2,y2),(0,0,255),2) # 擬合結果 lines = cv.HoughLinesP(edges,1,np.pi/180,100,minLineLength=100,maxLineGap=10) for line in lines: x1,y1,x2,y2 = line[0] cv.line(img,(x1,y1),(x2,y2),(0,255,0),2) cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows()
二、Opencv霍夫變換檢測矩形
除了檢測直線,Opencv霍夫變換還可以用於檢測矩形。對於矩形檢測,我們可以使用霍夫變換的概率式算法,通過調整參數來檢測出符合條件的矩形。
下面是一個簡單的例子,演示Opencv霍夫變換用於檢測矩形的結果:
import cv2 as cv import numpy as np img = cv.imread('image.jpg') gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) edges = cv.Canny(gray,50,150,apertureSize = 3) lines = cv.HoughLinesP(edges,1,np.pi/180,20,minLineLength=30,maxLineGap=10) # 轉換為霍夫坐標系 for i in range(lines.shape[0]): line = lines[i][0] x1,y1,x2,y2 = line cv.line(img,(x1,y1),(x2,y2),(0,0,255),1,cv.LINE_AA) # 檢測矩形 contours, hierarchy = cv.findContours(edges, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): cnt = contours[i] area = cv.contourArea(cnt) if area 10000: continue rect = cv.minAreaRect(cnt) box = cv.boxPoints(rect) box = np.int0(box) cv.drawContours(img,[box],0,(0,255,0),2) cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows()
三、Opencv檢測直線選取
在Opencv霍夫直線檢測中,由於圖像中的直線可能會非常多,因此我們需要對直線進行篩選和選取,以便於我們更加有效地分析和處理圖像。
在直線的篩選中,可以根據直線的長度、角度、距離等特徵進行篩選,只保留符合條件的直線。在選取直線時,可以根據直線的位置、長度、交叉情況等因素進行選擇,以便於我們更好地分析圖像的特徵。
下面是一個簡單的例子,演示如何對直線進行篩選和選取:
import cv2 as cv import numpy as np img = cv.imread('image.jpg') gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) edges = cv.Canny(gray,50,150,apertureSize = 3) lines = cv.HoughLinesP(edges,1,np.pi/180,20,minLineLength=30,maxLineGap=10) # 直線的篩選和選取 h,w = img.shape[:2] lineInfoList = [] for i in range(lines.shape[0]): line = lines[i][0] x1,y1,x2,y2 = line # 直線長度篩選 length = np.sqrt((x1-x2)**2 + (y1-y2)**2) if length < 50: continue # 直線角度篩選 angle = np.arctan2(y2-y1, x2-x1) * 180.0 / np.pi if angle 10: continue # 直線距離篩選 distance = abs(x1-x2) + abs(y1-y2) if distance > 0.2*w: continue # 記錄直線信息 lineInfoList.append((x1,y1,x2,y2)) # 直線的選取 for i in range(len(lineInfoList)): for j in range(i+1, len(lineInfoList)): x1,y1,x2,y2 = lineInfoList[i] x3,y3,x4,y4 = lineInfoList[j] # 交叉情況篩選 if (abs(x1-x3) + abs(y1-y3) + abs(x2-x4) + abs(y2-y4)) > (abs(x1-x4) + abs(y1-y4) + abs(x2-x3) + abs(y2-y3)): continue # 直線長度篩選 length1 = np.sqrt((x1-x2)**2 + (y1-y2)**2) length2 = np.sqrt((x3-x4)**2 + (y3-y4)**2) if length1 < 50 or length2 < 50: continue # 繪製選中的直線 cv.line(img,(x1,y1),(x2,y2),(0,0,255),2) cv.line(img,(x3,y3),(x4,y4),(0,0,255),2) cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/311344.html