python - Hough Circles 打开 CV 错误
问题描述
我目前正在使用HoughCircles
,computer-vision
但我无法让它工作。如何解决此错误?
Error :
'Traceback (most recent call last):
File "F:\TIPE ENTROPIE\Programmation\Iris-Recognition-master\Iris Code\norm.py", line 82, in <module>
extract_iris(img)
File "F:\TIPE ENTROPIE\Programmation\Iris-Recognition-master\Iris Code\norm.py", line 53, in extract_iris
cord = get_circle(img, 35, 0, 50, 40)
File "F:\TIPE ENTROPIE\Programmation\Iris-Recognition-master\Iris Code\norm.py", line 14, in get_circle
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT,1,20, param1=p1,param2=p2,minRadius=minR,maxRadius=maxR)
cv2.error: C:\projects\opencv-python\opencv\modules\imgproc \src\hough.cpp:1494: error: (-215) !_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat()) in function cv::HoughCircles`
这是我的代码:
import cv2
import numpy as np
## Definitions
def get_circle(img, minR, maxR, p1, p2):
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT,1,20, param1=p1,param2=p2,minRadius=minR,maxRadius=maxR)
circles = np.uint16(np.around(circles))
#return the first circle
return circles[0][0]
def print_img(img,x,y,w,h):
if w!=0 and h!=0:
cv2.imshow('detected circles',img[x:x+w,y:y+h])
cv2.imwrite('app-1/1.jpg',img[x:x+w,y:y+h])
else:
cv2.imshow('detected circles',img)
cv2.imwrite('app-1/1.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def reject_out(img, xc, yc, r):
row = len(img)
col = len(img[0])
for x in range(0,row):
for y in range(0, col):
res = (x-xc)*(x-xc) + (y-yc)*(y-yc)
if res > r*r :
img[x][y] = 0
def reject_in(img, xc, yc, r):
xs = xc-r
ys = yc-r
for x in range(xs,xs+2*r):
for y in range(ys, ys+2*r):
res = (x-xc)*(x-xc) + (y-yc)*(y-yc)
if res < r*r :
img[x][y] = 0
def extract_iris(img):
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cord = get_circle(cimg, 35, 0, 50, 40)
# draw the outer circle
cv2.circle(cimg,(cord[0],cord[1]),cord[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(cord[0],cord[1]),2,(0,0,255),3)
h = 2*cord[2]
w = 2*cord[2]
x = cord[1]-cord[2]
y = cord[0]-cord[2]
nimg = img[x:x+w,y:y+h]
reject_out(nimg, h/2, w/2, h/2)
print_img(cimg,0,0,0,0)
cord = get_circle(nimg, 0, cord[2]-1, 50, 30)
print (nimg[0:w][cord[0]])
# draw the outer circle
cv2.circle(nimg,(cord[0],cord[1]),cord[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(nimg,(cord[0],cord[1]),2,(0,0,255),3)
reject_in(nimg, cord[1], cord[0], cord[2])
print_img(nimg,0,0,0,0)
print (nimg[0:w][cord[0]])
img = cv2.imread('test6.jpg',0)
img = cv2.medianBlur(img,5)
extract_iris(img)
`
更新:新错误:
Traceback (most recent call last):
File "F:\TIPE ENTROPIE\Programmation\essai.py", line 80, in <module>
extract_iris(img)
File "F:\TIPE ENTROPIE\Programmation\essai.py", line 49, in extract_iris
cord = get_circle(cimg, 35, 0, 50, 40)
File "F:\TIPE ENTROPIE\Programmation\essai.py", line 8, in get_circle
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:11111: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor
解决方案
正如@jeru-luke 在评论中所说,您应该img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
在致电之前添加cv2.HoughCircles()
:
def get_circle(img, minR, maxR, p1, p2):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # <------------- Here
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT,1,20, param1=p1,param2=p2,minRadius=minR,maxRadius=maxR)
circles = np.uint16(np.around(circles))
COLOR_BGR2GRAY
并不是COLOR_GRAY2BGR
更新:
nimg = cv2.cvtColor(nimg, cv2.COLOR_GRAY2BGR)
在第二次调用之前添加get_circle
:
更新 2
import cv2
import numpy as np
## Definitions
def get_circle(img, minR, maxR, p1, p2):
if len(img.shape)==3:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT,1,20, param1=p1,param2=p2,minRadius=minR,maxRadius=maxR)
circles = np.uint16(np.around(circles))
#return the first circle
return circles[0][0]
def print_img(img,x,y,w,h):
if w!=0 and h!=0:
cv2.imshow('detected circles',img[x:x+w,y:y+h])
cv2.imwrite('app-1/1.jpg',img[x:x+w,y:y+h])
else:
cv2.imshow('detected circles',img)
cv2.imwrite('app-1/1.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def reject_out(img, xc, yc, r):
row = len(img)
col = len(img[0])
for x in range(0,row):
for y in range(0, col):
res = (x-xc)*(x-xc) + (y-yc)*(y-yc)
if res > r*r :
img[x][y] = 0
def reject_in(img, xc, yc, r):
xs = xc-r
ys = yc-r
for x in range(xs,xs+2*r):
for y in range(ys, ys+2*r):
res = (x-xc)*(x-xc) + (y-yc)*(y-yc)
if res < r*r :
img[x][y] = 0
def extract_iris(img):
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cord = get_circle(cimg, 35, 0, 50, 40)
# draw the outer circle
cv2.circle(cimg,(cord[0],cord[1]),cord[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(cord[0],cord[1]),2,(0,0,255),3)
h = 2*cord[2]
w = 2*cord[2]
x = cord[1]-cord[2]
y = cord[0]-cord[2]
nimg = img[x:x+w,y:y+h]
reject_out(nimg, h/2, w/2, h/2)
print_img(cimg,0,0,0,0)
nimg = cv2.cvtColor(nimg, cv2.COLOR_GRAY2BGR)
cord = get_circle(nimg, 0, cord[2]-1, 50, 30)
print (nimg[0:w][cord[0]])
# draw the outer circle
cv2.circle(nimg,(cord[0],cord[1]),cord[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(nimg,(cord[0],cord[1]),2,(0,0,255),3)
reject_in(nimg, cord[1], cord[0], cord[2])
print_img(nimg,0,0,0,0)
print (nimg[0:w][cord[0]])
img = cv2.imread('test6.jpg',0)
img = cv2.medianBlur(img,5)
extract_iris(img)
结果:
推荐阅读
- javascript - 在浏览器中单击按钮后,如果 else 语句不起作用
- git - 推送分支后,“您的分支领先于 'origin/master' 1 次提交”
- ruby-on-rails - Gem stream-rails : Gem 安装成功,但没有功能
- docker - 如何在 asp.net core 3.1 中覆盖来自 docker 的 appsetting 值?
- vert.x - Vert Http Client 最大连接池?这个池是每个端点还是总数?
- python - 为什么我在 / 处得到 NoReserverMatch?
- linear-regression - 使用线性回归为线性回归模型估算缺失值
- python - 有没有办法查看 Jupiter Notebook 是否停止运行?
- java - 如何使用 JSP 和 Servlet 编辑页面的 url
- django - JsonResponse 在 Django 视图中返回不可序列化的错误