【问题标题】:Finding Cirlcles in Eye or pupil using HoughCircles使用 HoughCircles 在眼睛或瞳孔中查找圆圈
【发布时间】:2017-08-18 14:40:09
【问题描述】:

我无法在图像上绘制圆圈。你能检查一下吗?问题在于绘制圆圈时我无法检索在图像上找到的圆圈的半径和中心。 提前致谢。

代码:(Python)

import cv,cv2
import numpy as np

def Eyes_Detect(frame):
    cas = cv2.CascadeClassifier("C:\opencv2.4.10\data\haarcascades\haarcascade_eye.xml")
    gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    x=1.1
    res=cas.detectMultiScale(gray,scaleFactor=x,minNeighbors=2,minSize=(20,50),flags=cv2.cv.CV_HAAR_SCALE_IMAGE)
    while len(res)>2:
        x+=0.1
        res=cas.detectMultiScale(gray,scaleFactor=x,minNeighbors=2,minSize=(20,50),flags=cv2.cv.CV_HAAR_SCALE_IMAGE)
    if len(res)<2:
        return (False,[])
    else:
        return (True,res)

def Find_Canny_Edges(frame):
    res = cv2.Canny(frame,100,200)
    return res

def Find_Circles(frame):
    cv.Smooth(frame,frame,cv.CV_GAUSSIAN, 7,7)
    storage=cv.CreateMat(frame.width, 1, cv.CV_32FC3)
    cv.HoughCircles(frame,storage,cv.CV_HOUGH_GRADIENT,2,100.0,30,150,100,140)
    return storage

def Draw_Circles(image,storage):
    for circle in storage:
        radius = circle[2]
        center = (circle[0], circle[1])
        cv.Circle(image, center, radius, (0, 0, 255), 3, 8, 0)
    return image
# Main    
cap = cv2.VideoCapture(0)
cap.set(3,1280)
cap.set(4,720)
ct=1
while True:
    ret,frame = cap.read()
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    result = Eyes_Detect(frame)
    if result[0]==True:
        result = Find_Canny_Edges(gray)
        cv2.imwrite("image.jpg",result)
        result = cv.LoadImage('image.jpg',0)
        result = Find_Circles(result)
        result = Draw_Circles(frame,result)
        cv2.imshow("Output",result)
        if cv2.waitKey(5) & 0xFF == ord('q'):
            break
cap.release()
cv2.destroyAllWindows()

【问题讨论】:

  • 为什么要将框架写入文件,然后重新加载该框架?这真的是不必要的。你是什​​么意思你“无法”检索半径和中心?
  • 实际上,通过 cv2 模块可以找到精明的边缘。通常这将适用于普通的 numpy 数组。但是在使用 cv Hough Circles 函数时,我们需要以 cvMat 格式发送图像矩阵(我不熟悉的东西)。只需在此行之后打印结果的数据类型“结果 = cv.LoadImage('image.jpg ',0) " .... 你会看到它的数据类型。否则您可以建议一些其他方法来检索坐标 r(radius),x,y ;其中 (x,y) 是中心。 . .
  • 我强烈建议不要保存中间图像...特别是使用 JPEG 压缩,因为您将获得压缩伪影以压缩图像以节省空间。压缩图像并再次加载它就像复印复印件一样。我也不明白为什么你用cvcv2 更容易使用?
  • 另外,您使用的是什么版本的 OpenCV?在 Python 命令提示符中执行 import cv2cv2.__version__ 并告诉我你得到了什么。
  • 是的 2.4.10 。我没有在 cv2 中找到任何其他方法来使用 houghCircles 方法检索圆圈数据。我也浏览了它的参数语法(cv2.HoughCirces)。当我打印结果时,它就像一个矩阵,如 4354X1 。 4354 是图像的宽度,我将其作为存储数组(numpy)的大小,空一个来存储方法结果。

标签: python opencv numpy


【解决方案1】:

你试过他们的tutorial。我提取下面的示例代码:

import cv2
import numpy as np

img = cv2.imread('opencv_logo.png',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=0,maxRadius=0)

if circles is None:
   print "No circles found"
else:
   circles = np.uint16(np.around(circles))
   for i in circles[0,:]:
      # draw the outer circle
      cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
      # draw the center of the circle
      cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

   cv2.imshow('detected circles',cimg)
   cv2.waitKey(0)
   cv2.destroyAllWindows()

【讨论】:

  • 是的,我尝试了这段代码。它显示错误,就像在 cv2 中没有名为 cv2.HOUGH_GRADIENT 的模块一样。关闭...
  • @AdityaByreddy:抱歉打错了。我刚刚编辑了我的代码。应读取参数:cv2.cv.CV_HOUGH_GRADIENT。请重试。
  • 是的,它的工作原理。谢谢@Ha Dang。我可以省略 cv2.cv.HOUGH_GRADIENT。我的意思是我会先做精明的边缘检测,这会产生边缘,就像二进制图像一样。那么如果我们再次应用渐变。希望你明白我的意思。
  • @AdityaByreddy:如果它适合您,请接受答案。关于您在评论中的问题,我的回答是“是的,为什么不”。
  • 教程链接断开
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 2011-05-29
  • 2012-09-01
  • 2017-04-15
  • 1970-01-01
  • 2012-05-07
  • 2011-04-27
  • 2013-07-27
相关资源
最近更新 更多