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
and hierarchy
. In the original code you did contours = cv2.findContour(...)
in which you combines both contours
and hierarchy
variables. Therefore you had an error. We simply don't need hieararchy
variable, therefore we placed _
. So the error was resolved.
Solution
Replace the findContours
line with the below:
contours, _ = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
Result: