[英]Cropping Circle with Hough Transform using OpenCV Python
I want to crop circle from iris image in following below:我想从下面的虹膜图像中裁剪圆圈:
and this is my code for circle detection:这是我的圆检测代码:
from matplotlib import pyplot as plt
import numpy as np
import cv2
gambar = cv2.imread('tes2.jpg',0)
cimg = cv2.cvtColor(gambar,cv2.COLOR_GRAY2BGR)
canny = cv2.Canny(cimg,50,50)
circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,10000,
param1=50,param2=30,minRadius=50,maxRadius=200)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[2]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[2]),2,(0,0,255),3)
plt.imshow(cimg,cmap = 'gray')
plt.show()
but, I don't know how to crop this circle (iris localization).但是,我不知道如何裁剪这个圆圈(虹膜定位)。 I have been following this code reference Cropping circle from the image using OpenCV python .我一直在使用 OpenCV python 从图像中跟踪此代码参考裁剪圆。 And this is my code below for crop image:这是我下面的裁剪图像代码:
from matplotlib import pyplot as plt
import numpy as np
import cv2
gambar1 =cv2.imread('tes2.jpg')
gambar = cv2.imread('tes2.jpg',0)
cimg = cv2.cvtColor(gambar,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(cimg, 50, 255, cv2.THRESH_BINARY)
# Create mask
height,width = gambar.shape
mask = np.zeros((height,width), np.uint8)
canny = cv2.Canny(thresh,100,200)
gray = cv2.cvtColor(gambar,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,10000,
param1=50,param2=30,minRadius=0,maxRadius=0)
for i in circles[0,:]:
cv2.circle(mask,(i[0],i[1]),i[2],(255,255,255),thickness=-1)
masked_data = cv2.bitwise_and(gambar1, gambar1, mask=mask)
# Apply Threshold
_,thresh = cv2.threshold(mask,1,255,cv2.THRESH_BINARY)
# Find Contour
contours = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])
# Crop masked_data
crop = masked_data[y:y+h,x:x+w]
plt.imshow(gambar1,cmap = 'gray')
plt.imshow(crop, cmap='gray')
plt.show()
but, when I try this code such as reference above, I get an error like this:但是,当我尝试此代码(例如上面的参考)时,出现如下错误:
File "C:/Users/zurri/spyder/masktes.py", line 14, in <module>
cimg = cv2.cvtColor(gambar,cv2.COLOR_BGR2GRAY)
error: OpenCV(4.2.0) c:\projects\opencv-python\opencv\modules\imgproc\src\color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0xe227985e::Set<1,-1,-1>,struct cv::impl::A0xe227985e::Set<0,2,5>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
Invalid number of channels in input image:
'VScn::contains(scn)'
where
'scn' is 1
anyone can help me to fix this problem?谁能帮我解决这个问题? I just want to crop this circle (iris localization) using openCV python, thank you我只想使用openCV python裁剪这个圆圈(虹膜定位),谢谢
Explanation解释
findContours
method retrieves the contours from the given binary image using Suzuki's algorithm. findContours
方法使用Suzuki算法从给定的二进制图像中检索轮廓。 Contours are useful for shape analysis, object detection and recognition.轮廓可用于形状分析、对象检测和识别。
The findContour
method returns two variables: contours
and hierarchy
. findContour
方法返回两个变量: contours
和hierarchy
。 In the original code you did contours = cv2.findContour(...)
in which you combines both contours
and hierarchy
variables.在原始代码中,您执行了contours = cv2.findContour(...)
在其中组合了contours
和hierarchy
变量。 Therefore you had an error.因此你有一个错误。 We simply don't need hieararchy
variable, therefore we placed _
.我们根本不需要hieararchy
变量,因此我们放置了_
。 So the error was resolved.于是错误就解决了。
Solution解决方案
Replace the findContours
line with the below:将findContours
行替换为以下内容:
contours, _ = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
Result:结果:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.