Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 计算更多的元素,然后它应该是_Python_Opencv - Fatal编程技术网

Python 计算更多的元素,然后它应该是

Python 计算更多的元素,然后它应该是,python,opencv,Python,Opencv,我正在用Python学习OpenCV,我想学习如何计算图像中的对象/元素 我写了一个计数代码,但是我得到了错误的结果。图像中有12个元素,我得到了40个,但也有一些元素没有计算在内 我不知道我做错了什么 这是我的代码: import cv2 img = cv2.imread('slika.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) print('There are 12 elements on this image') #cv2.i

我正在用Python学习OpenCV,我想学习如何计算图像中的对象/元素

我写了一个计数代码,但是我得到了错误的结果。图像中有12个元素,我得到了40个,但也有一些元素没有计算在内

我不知道我做错了什么

这是我的代码:

import cv2

img = cv2.imread('slika.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

print('There are 12 elements on this image')

#cv2.imshow('img', gray)
#cv2.waitKey(0)

ret,thresh = cv2.threshold(gray,127,255,1)
contours,h = cv2.findContours(thresh,1,1)

print('Number of elements found:', len(contours))

for cnt in contours:
    cv2.drawContours(img,[cnt],0,(0,0,255),2)

cv2.imshow('img', img)
cv2.waitKey(0)
这是默认图像,包含12个元素:

结果是:

您可以看到,粉红色和两个黄色元素无法识别,但这是绿色元素的问题


我做错了什么,以及如何解决这个问题?

有几点需要改进您当前的代码

如果你真的看了一眼你的灰色图像,你会发现你的阈值127太低了。黄色和粉色结构的灰度值高于127,然后被cv2.threshold忽略。出于同样的原因,绿色结构也支离破碎。通常,最好使用实际的枚举值,如,而不是它们的数值

对于轮廓检测,最好采用检索模式,只考虑大部分外部轮廓。同样,使用枚举值

通过这些更改,您的代码可以正常工作:

进口cv2 读取图像 img=cv2.imread'DIVmd.jpg' 将图像转换为灰度 灰色=cv2.CVT颜色,cv2.COLOR\U BGR2GRAY 显示灰度图像 cv2.显示“灰色”,灰色 打印“此图像上有12个元素” 阈值为224的反向二值阈值图像, i、 e.值大于224的每个像素设置为0, 并且值低于224的每个像素被设置为1 _,thresh=cv2.thresholdgray,224255,cv2.thresh\u BINARY\u INV 显示阈值图像 cv2.imshow'thresh',thresh 寻找轮廓 cv2.RETR_外部:仅检索最外部轮廓 cv2.CHAIN_近似值_无:绝对存储所有轮廓点 轮廓,h=cv2.findContoursthresh,cv2.RETR\u外部,cv2.CHAIN\u近似值\u无 打印“找到的元素数:”,然后打印 迭代所有找到的轮廓 对于轮廓中的cnt: 在原始/最终图像中绘制轮廓 cv2.Simg,[cnt],0,0,0,255,2 显示最终图像 cv2.imshow'img',img cv2.0 出于可视化目的,这是您的灰色图像:

这是实际的阈值图像阈值:

最后,输出img:

当然,打印输出现在也是正确的:

此图像上有12个元素 找到的元素数:12
希望有帮助

有几点需要改进您当前的代码

如果你真的看了一眼你的灰色图像,你会发现你的阈值127太低了。黄色和粉色结构的灰度值高于127,然后被cv2.threshold忽略。出于同样的原因,绿色结构也支离破碎。通常,最好使用实际的枚举值,如,而不是它们的数值

对于轮廓检测,最好采用检索模式,只考虑大部分外部轮廓。同样,使用枚举值

通过这些更改,您的代码可以正常工作:

进口cv2 读取图像 img=cv2.imread'DIVmd.jpg' 将图像转换为灰度 灰色=cv2.CVT颜色,cv2.COLOR\U BGR2GRAY 显示灰度图像 cv2.显示“灰色”,灰色 打印“此图像上有12个元素” 阈值为224的反向二值阈值图像, i、 e.值大于224的每个像素设置为0, 并且值低于224的每个像素被设置为1 _,thresh=cv2.thresholdgray,224255,cv2.thresh\u BINARY\u INV 显示阈值图像 cv2.imshow'thresh',thresh 寻找轮廓 cv2.RETR_外部:仅检索最外部轮廓 cv2.CHAIN_近似值_无:绝对存储所有轮廓点 轮廓,h=cv2.findContoursthresh,cv2.RETR\u外部,cv2.CHAIN\u近似值\u无 打印“找到的元素数:”,然后打印 迭代所有找到的轮廓 对于轮廓中的cnt: 在原始/最终图像中绘制轮廓 cv2.Simg,[cnt],0,0,0,255,2 显示最终图像 cv2.imshow'img',img cv2.0 出于可视化目的,这是您的灰色图像:

这是实际的阈值图像阈值:

最后,输出img:

当然,打印输出现在也是正确的:

此图像上有12个元素 找到的元素数:12
希望有帮助

这是毒品,我的朋友,你是最好的!谢谢你能不能在每一行旁边写一条评论,因为我是一个noob:这是做什么的:cv2.RETR\u EXTERNAL,cv2.CHAIN\u APPROX\u NONEetc@taga我在上面的代码中添加了一些解释性的注释,请看。除此之外,请看一看OpenCV上的文档和其他链接。这是dope我的朋友,你是最好的!谢谢你能不能在每一行旁边写一条评论,因为我是一个noob:这是做什么的:cv2.RETR\u EXTERNAL,cv2.CHAIN\u APPROX\u NONEetc@taga我在上面的代码中添加了一些解释性的注释,请看。除此之外,请看一下OpenCV文档 和其他链接。