Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV点目标检测未找到所有目标,发现圆偏移_Python_C_Opencv_Image Processing_Computer Vision - Fatal编程技术网

Python OpenCV点目标检测未找到所有目标,发现圆偏移

Python OpenCV点目标检测未找到所有目标,发现圆偏移,python,c,opencv,image-processing,computer-vision,Python,C,Opencv,Image Processing,Computer Vision,我正试图检测黑点/白点目标的中心,如图所示。 我尝试过使用cv2.HoughCircles方法,但是1,我只能检测到2到3个目标,2,当我将找到的圆重新绘制到图像上时,它们总是略微偏移 我用错方法了吗?我应该使用findContours还是完全不同的东西 这是我的密码: import cv2 from cv2 import cv import os import numpy as np def showme(pic): cv2.imshow('window',pic) cv2

我正试图检测黑点/白点目标的中心,如图所示。 我尝试过使用cv2.HoughCircles方法,但是1,我只能检测到2到3个目标,2,当我将找到的圆重新绘制到图像上时,它们总是略微偏移

我用错方法了吗?我应该使用findContours还是完全不同的东西

这是我的密码:

import cv2
from cv2 import cv
import os
import numpy as np

def showme(pic):
    cv2.imshow('window',pic)
    cv2.waitKey()
    cv2.destroyAllWindows()


im=cv2.imread('small_test.jpg')

gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

#I've tried blur,bw,tr...  all give me poor results.

blur = cv2.GaussianBlur(gray,(3,3),0)
n,bw = cv2.threshold(blur,120,255,cv2.THRESH_BINARY)
tr=cv2.adaptiveThreshold(blur,255,0,1,11,2)

circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 3, 100, None, 200, 100, 5, 16)

try:
    n = np.shape(circles)
    circles=np.reshape(circles,(n[1],n[2]))
    print circles
    for circle in circles:
        cv2.circle(im,(circle[0],circle[1]),circle[2],(0,0,255))
    showme(im)
except:
    print "no cicles found"
这是我当前的输出:


由于圆模式是固定的,并且与对象有很好的区别,简单的模板匹配应该可以很好地工作,请查看
cvMatchTemplate
。对于更复杂的条件(由于对象形状或视图几何体而扭曲),您可以尝试更强大的功能,如SIFT或SURF(
cvExtractSURF
)。

播放我编写的代码,我能够获得更好的结果:

都是关于参数的。总是这样

此程序中调用了三个重要函数,您应该尝试使用它们:
cvSmooth()
cvCanny()
,以及
cvhoughcirles()
。它们中的每一个都有可能彻底改变结果

下面是C代码:

IplImage* img = NULL;
if ((img = cvLoadImage(argv[1]))== 0)
{
    printf("cvLoadImage failed\n");
}

IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
CvMemStorage* storage = cvCreateMemStorage(0);

cvCvtColor(img, gray, CV_BGR2GRAY);

// This is done so as to prevent a lot of false circles from being detected
cvSmooth(gray, gray, CV_GAUSSIAN, 7, 9);

IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
cvCanny(gray, canny, 40, 240, 3);

CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/8, 120, 10, 2, 25);
cvCvtColor(canny, rgbcanny, CV_GRAY2BGR);

for (size_t i = 0; i < circles->total; i++)
{
     // round the floats to an int
     float* p = (float*)cvGetSeqElem(circles, i);
     cv::Point center(cvRound(p[0]), cvRound(p[1]));
     int radius = cvRound(p[2]);

     // draw the circle center
     cvCircle(rgbcanny, center, 3, CV_RGB(0,255,0), -1, 8, 0 );

     // draw the circle outline
     cvCircle(rgbcanny, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );

     printf("x: %d y: %d r: %d\n",center.x,center.y, radius);
}

cvNamedWindow("circles", 1);
cvShowImage("circles", rgbcanny);

cvSaveImage("out.png", rgbcanny);
cvWaitKey(0);
IplImage*img=NULL;
if((img=cvLoadImage(argv[1]))==0)
{
printf(“cvLoadImage失败\n”);
}
IplImage*gray=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
CvMemStorage*storage=cvCreateMemStorage(0);
CVT颜色(img、灰色、CV_bgr2灰色);
//这样做是为了防止检测到大量假圆
cvSmooth(灰色、灰色、CV_高斯、7、9);
IplImage*canny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
IplImage*rgbcanny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
cvCanny(灰色,canny,40,240,3);
CvSeq*circles=cvHoughCircles(灰色、存储、CV_-HOUGH_渐变、2、灰色->高度/8120、10、2、25);
CVTColor(canny、rgbcanny、CV_GRAY2BGR);
对于(大小i=0;itotal;i++)
{
//将浮点数四舍五入为整数
float*p=(float*)cvGetSeqElem(圆,i);
cv::点中心(cvRound(p[0]),cvRound(p[1]);
int radius=cvRound(p[2]);
//画圆心
CV圆(rgbcanny,center,3,CV_RGB(0255,0),-1,8,0);
//画圆的轮廓
CV圆(rgbcanny,圆心,半径+1,CV_RGB(0,0255),2,8,0);
printf(“x:%d y:%d r:%d\n”,中心x,中心y,半径);
}
cvNamedWindow(“圆圈”,1);
cvShowImage(“圆”,rgbcanny);
cvSaveImage(“out.png”,rgbcanny);
cvWaitKey(0);

我相信您有能力将其移植到Python。

大多数人都使用Python代码检测圆圈

import cv2
import numpy as np

img = cv2.imread('coin.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(7,9),6)
cimg = cv2.cvtColor(blur,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(blur,cv2.HOUGH_GRADIENT,1,50,
                            param1=120,param2=10,minRadius=2,maxRadius=30)


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()

希望看到您当前的输出。您可能有兴趣检查这个线程:这是上面代码的输出![我的代码结果][1][1]:也许是时候回顾一下你的其他问题,并接受解决这些问题的答案(如果有的话)。每个答案旁边都有一个小复选框,单击它可以选择您问题的正式答案。谢谢您的帮助。我将致力于在Python上移植它。我将使用这些目标(我已经知道有3d位置,使用TRITOP系统[link])来计算零件的位置/方向。在我用这个方法找到圆之后,你会推荐另外一种方法来非常精确地计算目标的中心吗?再次感谢,整个程序可以成为一个单独的函数,执行几次(使用不同的参数),每次迭代后,将找到的圆与前一次迭代进行比较,以确保所有圆都是好的。这种方法可能会告诉您,右侧最大的圆不是一个好的圆。您在圆检测中是否使用了
canny
rgbcanny
?看起来不是,但我想确保圆检测部分是由
cvhoughcirles()
完成的。检查它需要哪些参数,你就会得到答案。代码的其余部分只是在原始图像的副本(rgbcanny)上画圆。欢迎投票支持我的答案。谢谢你@karlphillip。令人惊讶的是,代码速度非常快,并且可以在实时视频提要上工作(即使是在python中实现的)。你对视频有什么建议?我用它来分析安装在我的玩具吊桶上的摄像机上的视频。所以我面临的问题是,它在几帧中突然检测到100个圆圈,然后砰的一声,它们在下一帧中消失了。这对我使用的任何控制器都是危险的。