簡體   English   中英

使用具有3通道輸入的HoughCircles時出錯

[英]Error using HoughCircles with 3-channel input

在檢測圓圈之前,我正在用green通道替換red通道。 更換頻道后,我將其傳遞給模糊濾鏡,然后進行霍夫變換以檢測圓圈。 但是當我這樣做時,我收到一條糟糕的錯誤消息:

OpenCV(3.4.1) Error: Assertion failed (!_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || 

_image.isUMat())) in HoughCircles, file /io/opencv/modules/imgproc/src/hough.cpp, line 1659
Traceback (most recent call last):

  File "circle_light.py", line 44, in <module>
    param1=param1,param2=param2,minRadius=minRadius,maxRadius=maxRadius)

cv2.error: OpenCV(3.4.1) /io/opencv/modules/imgproc/src/hough.cpp:1659: error: (-215) !_image.empty() 

&& _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat()) in function HoughCircles

我無法理解它,因此無法理解我可能做錯了什么。 這是我所做的片段。

import cv2

img = cv2.imread("images/{}".format("img.png"), 1)

b,g,r = cv2.split(img)
img = cv2.merge([b,g,g])
img = cv2.GaussianBlur(img,(5,5),0)

minDist = 11
param1 = 20
param2 = 20
minRadius = 10
maxRadius = 20

circles = cv2.HoughCircles(
    img, cv2.HOUGH_GRADIENT, 1, minDist,
    param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius
)

當我調用HoughCircles函數時發生錯誤。 我可能做錯了什么?

您只能在單通道(灰度)圖像上調用cv2.HoughCircles() ,您的圖像有3個通道。

文檔

關於解釋錯誤。 它來自hough.cpp#L1659

CV_Assert(!_image.empty() && _image.type() == CV_8UC1 && (_image.isMat() || _image.isUMat()));

打破它,所有以下條件必須是真實的:

  • !_image.empty() :輸入圖像不應為空;
  • _image.type() == CV_8UC1 :輸入圖像必須是8U (8位無符號, np.uint8 )和C1 (單通道);
  • _image.isMat() || _image.isUMat() _image.isMat() || _image.isUMat() :檢查輸入是Mat還是UMat (在Python中,它必須是一個numpy數組);

關於你的具體錯誤信息( error: (-215) !_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat()) ):


我會嘗試補充@Mark Setchell的答案,因為我很好奇,我想分享:)

如果查看文檔, cv2.HoughCircle()imgproc模塊的一部分(在Feature Detection子模塊 ”下)。 文檔說,唯一實現的方法是HOUGH_GRADIENT (又名21HT ,即兩階段霍夫變換),他們指出參考文獻“ 霍夫變換方法的圓形發現的比較研究 ”(1990):)。 如果由於付費牆而無法訪問,則可以免費訪問1989版本 在論文中,作者評論道:

HT形狀分析方法使用約束方程將特征空間中的點與搜索到的形狀的可能參數值相關聯。 對於每個特征點, 總是邊緣點 ,對滿足約束的所有參數組合累積投票。 [...]

后來,他們寫道:

如果邊緣方向信息可用 ,那么減少圓形發現的存儲和計算需求的一種方法是將問題分解為兩個階段[...]

因此,如果你想堅持21HT,你基本上需要邊緣和邊緣方向信息。 例如,您可以通過Sobel獲取邊緣方向信息(例如, dxdy ),並使用這些已經計算的dxdy來使用Canny獲取邊緣。 實際上,這就是OpenCV實現的功能。 如果您導航到modules/imgproc/src/hough.cpp ,您可以在此處查看Sobel + Sobel + Canny操作。

所以呢? 嗯,這意味着如果你有另一種方法(或者你想提出一個新方法,為什么不呢?)能夠返回更適合你的情況的邊緣和邊緣方向信息(可能顏色有不同的含義)您的情況),然后您可以用您的方法替換這3行(Sobel + Sobel + Canny)並重新使用其余的實現(很酷,嗯?)。 如果你有靈感:),你可以看看“ 彩色邊緣檢測的簡史 ”並從那里開始。

那么,為什么我們需要單通道輸入? 好吧,主要是因為我們需要邊緣,它們通常表示為單通道圖像 此外,該實現目前僅支持單通道邊緣和邊緣方向信息。 但是,大多數這些概念可以擴展到多通道輸入。 我認為,因為沒有通用的解決方案(可能這些概念在個案基礎上有所改變)而且很少有人會從中受益,到目前為止,沒有人願意提供任何實施。

對不起,答案很長。 我知道TL; DR“方法需要單通道輸入”就足夠了。 我很好奇,想分享=]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM