Opencv霍夫直線檢測

一、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-tw/n/311344.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-05 13:23
下一篇 2025-01-05 13:23

相關推薦

  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • 如何求直線與曲線的交點

    對於數學問題來說,求直線與曲線的交點可能是其中一種最基本的問題之一。在本文中,我們將從多個方面詳細闡述關於求解直線與曲線交點的方法。 一、解析幾何方法 解析幾何是數學中比較基礎的一…

    編程 2025-04-29
  • Python直線

    Python是一種高層次、通用、解釋型、開源、動態數據類型的編程語言。它有快速、可讀性強的特點,同時在數據分析、人工智慧、Web開發等領域也有廣泛的應用。本文將從多個方面詳細闡述P…

    編程 2025-04-27
  • Python編程烏龜畫直線

    本文將詳細介紹如何使用Python編寫程序來控制烏龜畫直線。 一、安裝turtle庫 要使用Python完成烏龜畫直線的編程,需要安裝turtle庫。其實,在安裝Python時已經…

    編程 2025-04-27
  • Opencv 實現讀取 BMP 圖片

    Opencv 是一個基於 C/C++ 語言的開源計算機視覺庫,可以用於圖像處理、特徵識別、目標跟蹤、機器學習等領域。在圖像處理中,讀取 BMP 圖片是常見操作之一。 一、打開 BM…

    編程 2025-04-27
  • opencv滑鼠繪圖

    本文將為您詳細介紹如何使用opencv在原始圖片上進行滑鼠繪圖。 一、準備工作 在開始繪製之前,您需要先準備好以下的工作: 1、安裝opencv庫,可以通過pip install …

    編程 2025-04-27
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • OpenCV的全面介紹

    OpenCV是一款強大的開源計算機視覺庫,它包含了各種用於圖像和視頻處理,圖像識別和機器學習的函數,它可以用於開發實時的計算機視覺軟體和系統,特別適用於圖像處理、物體識別、人臉識別…

    編程 2025-04-25
  • Opencv CUDA編譯用法介紹

    本文將從多個方面對Opencv CUDA編譯進行詳細的闡述和解讀。通過以下小標題,我們將詳細介紹如何進行編譯。 一、環境搭建 在使用CUDA進行加速之前,需要進行CUDA的環境搭建…

    編程 2025-04-25

發表回復

登錄後才能評論