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. 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
Explanation
findContours
method retrieves the contours from the given binary image using Suzuki's algorithm. Contours are useful for shape analysis, object detection and recognition.The
findContour
method returns two variables:contours
andhierarchy
. In the original code you didcontours = cv2.findContour(...)
in which you combines bothcontours
andhierarchy
variables. Therefore you had an error. We simply don't needhieararchy
variable, therefore we placed_
. So the error was resolved.Solution
Replace the
findContours
line with the below:Result: