日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV识别圆(复杂背景下的圆)

發(fā)布時(shí)間:2024/3/24 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV识别圆(复杂背景下的圆) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 顏色模式 HSL和HSV cv2.inRange函數(shù)
  • 邊緣提取
  • 圖像閾值
  • OpenCv的HoughCircles函數(shù)
    • 函數(shù)原型:
    • 參數(shù)解釋:
    • 實(shí)例:
  • 檢測(cè)復(fù)雜背景下的圓

顏色模式 HSL和HSV cv2.inRange函數(shù)

參考:

  • 整理:opencv顏色灰度值、HSV和HSL
  • HSL和HSV色彩空間
  • RGB、HSV和HSL顏色空間

HSL(PowerPoint中顏色模式之一)即色相、飽和度、亮度(英語:Hue, Saturation, Lightness)。HSV(Opencv中的顏色模式)即色相、飽和度、明度(英語:Hue, Saturation, Value),又稱HSB,其中B即英語:Brightness。

由于這里使用Opencv,所以暫時(shí)只關(guān)注HSV

  • 常規(guī)使用:

    • H hue 色相 取值范圍0-360 ° 角度 使用圓環(huán)來表示顏色
    • S Saturation 飽和度 范圍 0-100 % 百分比
    • V Value 明度 范圍 0-100 % 百分比
      +Hue 用角度度量,取值范圍為0~360°,表示色彩信息,即所處的光譜顏色的位置。表示如下:

      顏色圓環(huán)上所有的顏色都是光譜上的顏色,從紅色開始按逆時(shí)針方向旋轉(zhuǎn),Hue=0 表示紅色,Hue=120 表示綠色,Hue=240 表示藍(lán)色等等。
      顏色圓環(huán)上所有的顏色都是光譜上的顏色,從紅色開始按逆時(shí)針方向旋轉(zhuǎn),Hue=0 表示紅色,Hue=120 表示綠色,Hue=240 表示藍(lán)色等等。
      HSV 圓柱體的半邊橫截面(Hue=60):

      其中水平方向表示飽和度,飽和度表示顏色接近光譜色的程度。飽和度越高,說明顏色越深,越接近光譜色飽和度越低,說明顏色越淺,越接近白色。飽和度為0表示純白色。取值范圍為0~100%,值越大,顏色越飽和。
      豎直方向表示明度,決定顏色空間中顏色的明暗程度,明度越高,表示顏色越明亮,范圍是 0-100%。明度為0表示純黑色(此時(shí)顏色最暗)。
  • Opencv中的HSV Changing Colorspaces:

    • H hue 色相 范圍 [0,179]
    • S saturation 飽和度 范圍[0,255]
    • V value 明度 范圍 [0,255]
    • 不同的軟件有不同的量程檔,需要自己進(jìn)行正則化/歸一化,將數(shù)據(jù)縮放至Opencv的這個(gè)值的范圍內(nèi)。
    • 獲取某個(gè)RGB顏色對(duì)應(yīng)的HSV值:
    green = np.uint8([[[0,255,0 ]]]) hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV) # 所以cvtColor函數(shù)不僅可以用來處理圖像 也可以處理簡(jiǎn)單的一個(gè)數(shù)值變量 print( hsv_green ) [[[ 60 255 255]]]
  • inRange函數(shù)使用:

    • python-opencv中的cv2.inRange函數(shù)
    • 函數(shù)原型 -Opencv inRange
    • 使用demo:Changing Colorspaces
import cv2 import numpy as npcap = cv2.VideoCapture(0)while(1):# Take each frame_, frame = cap.read()# Convert BGR to HSV 將圖片從BGR轉(zhuǎn)為HSV顏色模式hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# define range of blue color in HSV 定義要提取的顏色范圍(使用HSV表示)lower_blue = np.array([110,50,50])upper_blue = np.array([130,255,255])# BGR顏色表示 轉(zhuǎn) HSV顏色表示 也可以使用 cvtColor來表示green = np.uint8([[[0,255,0 ]]])hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)# Threshold the HSV image to get only blue colorsmask = cv2.inRange(hsv, lower_blue, upper_blue)# Bitwise-AND mask and original imageres = cv2.bitwise_and(frame,frame, mask= mask)cv2.imshow('frame',frame)cv2.imshow('mask',mask)cv2.imshow('res',res)k = cv2.waitKey(5) & 0xFFif k == 27:breakcv2.destroyAllWindows()

邊緣提取

  • findContours 輪廓查找
  • Finding contours in your image?
  • Contours : Getting Started
  • OpenCV – Contour輪廓
  • 邊緣檢測(cè),框出物體的輪廓(使用opencv-python)
  • OpenCV: Detecting Edges, Lines, and Shapes

圖像閾值

參考: Opencv-tutroal—Image Thresholding

  • 圖像閾值主要包括:
    • 簡(jiǎn)單的閾值: cv2.threshold函數(shù)
      • cv2.THRESH_BINARY
      • cv2.THRESH_BINARY_INV
      • cv2.THRESH_TRUNC
      • cv2.THRESH_TOZERO
      • cv2.THRESH_TOZERO_INV
    • 自適應(yīng)閾值:cv2.adaptiveThreshold

OpenCv的HoughCircles函數(shù)

官方文檔-FeatureDetection-HoughCircles()

函數(shù)原型:

注意:通常該功能可以很好地檢測(cè)圓心。 但是,它可能找不到正確的半徑。 您可以通過指定半徑范圍(minRadius和maxRadius)來輔助該功能。 或者,對(duì)于HOUGH_GRADIENT方法,您可以將maxRadius設(shè)置為負(fù)數(shù),以便僅在不進(jìn)行半徑搜索的情況下返回中心,并使用其他過程查找正確的半徑。

參數(shù)解釋:

  • image 8bit 單通道圖像 輸入灰度圖
  • circles 輸出檢測(cè)到的圓,每個(gè)向量由3個(gè)(x,y,radius)或4個(gè)浮點(diǎn)數(shù)點(diǎn)(x,y,radius,votes)。不知道votes是干啥的???
  • method 探測(cè)方法,目前只有 HOUGH_GRADIENT 和HOUGH_GRADIENT_ALT這兩個(gè)可以使用
    • basically 21HT, described in [266] 看一篇論文了解原理
    • HK Yuen, John Princen, John Illingworth, and Josef Kittler. Comparative study of hough transform methods for circle finding. Image and Vision Computing, 8(1):71–77, 1990.
    • HOUGH_GRADIENT_ALT是HOUGH_GRADIENT的變體,有更高的準(zhǔn)確率
  • dp 累加器分辨率與圖像分辨率的反比。 例如,如果dp = 1,則累加器具有與輸入圖像相同的分辨率。 如果dp = 2,則累加器的寬度和高度是其一半。 對(duì)于HOUGH_GRADIENT_ALT,建議值為dp = 1.5,除非需要檢測(cè)到一些很小的圓圈。
  • minDist 檢測(cè)到的圓心之間的最小距離。 如果參數(shù)太小,則除了真實(shí)的圓圈外,還可能會(huì)錯(cuò)誤地檢測(cè)到多個(gè)鄰居圓圈。 如果太大,可能會(huì)錯(cuò)過一些圓圈。
  • param1 第一個(gè) 方法特定的參數(shù)。 對(duì)于HOUGH_GRADIENT和HOUGH_GRADIENT_ALT,它是傳遞給Canny邊緣檢測(cè)器的兩個(gè)閾值中的較高閾值(較低的閾值則小兩倍)。 請(qǐng)注意,HOUGH_GRADIENT_ALT使用Scharr算法來計(jì)算圖像導(dǎo)數(shù),因此閾值通常應(yīng)較高,例如300或正常曝光和對(duì)比圖像。
  • param2 第二種方法特定的參數(shù)。
    • 在HOUGH_GRADIENT的情況下,它是檢測(cè)階段圓心的累加器閾值。 它越小,可能會(huì)檢測(cè)到更多的假圓圈。 與較大的累加器值相對(duì)應(yīng)的圓將首先返回。 該值越小,可以檢測(cè)到更多根本不存在的圓,該值越大,能通過檢測(cè)的圓就更加接近完美的圓形 (這個(gè)值越大,對(duì)所檢測(cè)的圓的完美程度要求越高)
    • 在HOUGH_GRADIENT_ALT算法的情況下,這是圓的“完美”度量。 它越接近1,則選擇的形狀更好的圓形算法。 在大多數(shù)情況下,0.9應(yīng)該可以。 如果要更好地檢測(cè)小圓圈,可以將其降低到0.85、0.8甚至更低。 但是,然后還要嘗試限制搜索范圍[minRadius,maxRadius],以避免出現(xiàn)許多錯(cuò)誤的圓圈。
  • minRadius 圓的最小半徑
  • maxRadius 圓的最大半徑。 If <= 0,則使用最大圖像尺寸. If < 0, HOUGH_GRADIENT 只返回圓心坐標(biāo)而不返回半徑。HOUGH_GRADIENT_ALT 則始終計(jì)算圓半徑

實(shí)例:

circles=cv2.HoughCircles(binary,cv2.HOUGH_GRADIENT,4,25,param1=100,param2=40,minRadius=8,maxRadius=15) # 注意看參數(shù) 測(cè)試的話 可以把參數(shù)卡的死一點(diǎn) # dp =4 因?yàn)橐獧z測(cè)的圓比較小 # minDist 要檢測(cè)的圓之間圓心之間的距離 自己目測(cè)看吧 越準(zhǔn)確越好。。。 如果這個(gè)值過大或者過小,會(huì)發(fā)現(xiàn)很多圓都偏移的厲害(這個(gè)算法對(duì)設(shè)置的參數(shù)非常看重,有些地方明明沒有圓,只要設(shè)置了這個(gè)參數(shù),有點(diǎn)的差不多的都給你畫出個(gè)圓來) # param1 是跟著一個(gè)教程走的 # param2 如果你的圖中的圓非常標(biāo)準(zhǔn) 這個(gè)數(shù)就可以大點(diǎn),越大表示所要檢測(cè)的圓越標(biāo)準(zhǔn) # minRadius和maxRadius就根據(jù)自己圖的實(shí)際情況來定就好print(len(circles[0]),circles)for (x,y,r) in circles[0]:x=int(x)y=int(y)if 0<x<50 and 100<y<550:passelse:output_circle=cv2.circle(hole_right,(x,y),int(r),(0,0,255),3)output=cv2.rectangle(output_circle,(x-2,y-2),(x+2,y+2),(255,255,255),1) plt.figure(figsize=(10,20)) plt.imshow(output,'gray')


其中param1是根據(jù) OpenCV #010 Circle Detection Using Hough Transform 這個(gè)教程里的設(shè)置的

檢測(cè)復(fù)雜背景下的圓

參考:

  • opencv 識(shí)別圖片上帶顏色的圓 帶完整代碼
  • 如何檢測(cè)一個(gè)圓在多個(gè)圓內(nèi)?
  • Circle Detection using OpenCV | Python
  • OpenCV #010 Circle Detection Using Hough Transform
  • Detecting overlapping circles
  • OpenCV Coin Detection Project
  • Counting blue and white bacteria colonies with Python and OpenCV
  • Hough Circle Transform
  • https://stackoverflow.com/questions/9860667/writing-robust-color-and-size-invariant-circle-detection-with-opencv-based-on
  • https://stackoverflow.com/questions/26932891/detect-touching-overlapping-circles-ellipses-with-opencv-and-python

總結(jié)

以上是生活随笔為你收集整理的OpenCV识别圆(复杂背景下的圆)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。