![](/img/trans.png)
[英]Using U-net in Python with 3-channel input images for image segmentation
[英]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())
):
CV_StsAssert
; CV_8UC1
。 你好奇知道為什么嗎? 你應該:)我們走了:
CV_8UC1
CV_MAKETYPE(CV_8U,1)
::來自#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
CV_MAKETYPE(0,1)
::來自#define CV_8U 0
(CV_MAT_DEPTH(0) + (((1)-1) << CV_CN_SHIFT))
:: from #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
(((0) & CV_MAT_DEPTH_MASK) + (((1)-1) << CV_CN_SHIFT))
:: from #define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK)
(((0) & (CV_DEPTH_MAX - 1)) + (((1)-1) << CV_CN_SHIFT))
:: from #define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1)
(((0) & ((1 << CV_CN_SHIFT) - 1)) + (((1)-1) << CV_CN_SHIFT))
:: from #define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
(((0) & ((1 << 3) - 1)) + (((1)-1) << 3))
:: from #define CV_CN_SHIFT 3
我會嘗試補充@Mark Setchell的答案,因為我很好奇,我想分享:)
如果查看文檔, cv2.HoughCircle()
是imgproc模塊的一部分(在Feature Detection “ 子模塊 ”下)。 文檔說,唯一實現的方法是HOUGH_GRADIENT (又名21HT ,即兩階段霍夫變換),他們指出參考文獻“ 霍夫變換方法的圓形發現的比較研究 ”(1990):)。 如果由於付費牆而無法訪問,則可以免費訪問1989版本 。 在論文中,作者評論道:
HT形狀分析方法使用約束方程將特征空間中的點與搜索到的形狀的可能參數值相關聯。 對於每個特征點, 總是邊緣點 ,對滿足約束的所有參數組合累積投票。 [...]
后來,他們寫道:
如果邊緣方向信息可用 ,那么減少圓形發現的存儲和計算需求的一種方法是將問題分解為兩個階段[...]
因此,如果你想堅持21HT,你基本上需要邊緣和邊緣方向信息。 例如,您可以通過Sobel
獲取邊緣方向信息(例如, dx
和dy
),並使用這些已經計算的dx
和dy
來使用Canny
獲取邊緣。 實際上,這就是OpenCV實現的功能。 如果您導航到modules/imgproc/src/hough.cpp
,您可以在此處查看Sobel + Sobel + Canny操作。
所以呢? 嗯,這意味着如果你有另一種方法(或者你想提出一個新方法,為什么不呢?)能夠返回更適合你的情況的邊緣和邊緣方向信息(可能顏色有不同的含義)您的情況),然后您可以用您的方法替換這3行(Sobel + Sobel + Canny)並重新使用其余的實現(很酷,嗯?)。 如果你有靈感:),你可以看看“ 彩色邊緣檢測的簡史 ”並從那里開始。
那么,為什么我們需要單通道輸入? 好吧,主要是因為我們需要邊緣,它們通常表示為單通道圖像 。 此外,該實現目前僅支持單通道邊緣和邊緣方向信息。 但是,大多數這些概念可以擴展到多通道輸入。 我認為,因為沒有通用的解決方案(可能這些概念在個案基礎上有所改變)而且很少有人會從中受益,到目前為止,沒有人願意提供任何實施。
對不起,答案很長。 我知道TL; DR“方法需要單通道輸入”就足夠了。 我很好奇,想分享=]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.