我是OpenCV的新手并且有一些问题。 我需要根据它们的形状检测瓶子或罐子。 为此我使用了覆盆子pi板和pi相机。 背景总是黑色,不会改变。 我已经尝试了很多可能的解决方案来解决这个问题但是无法获得满意的结 我尝试过的东西包括边缘检测,形态转换,matchShapes(),matchTemplate()。 如果我能够有效且最准确地完成这项任务,请告诉我。

示例图片:

在此输入图像描述

===============>>#1 票数:3

我想出了一个可能有帮助的方法! 如果您了解罐头的更多信息,即宽高比,通过调整矩形尺寸可以更加稳固!

途径

  • 将图像转换为HSV颜色空间。 V增加2倍,以获得更多可见的东西。
  • xy方向找到Sobel导数。 计算两个方向的重量相等的量值。
  • 使用Otsu方法阈值图像。
  • Closing应用于您的图像。
  • 应用Canny边缘探测器。
  • 找到霍夫线变换
  • 查找线图像的边界矩形。
  • 将其叠加到您的图像上。(最后完成:P)

image = cv2.imread('image3.jpg', cv2.IMREAD_COLOR)
original = np.copy(image)
if image is None:
    print 'Can not read/find the image.'
    exit(-1)

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
H,S,V = hsv_image[:,:,0], hsv_image[:,:,1], hsv_image[:,:,2]
V = V * 2

hsv_image = cv2.merge([H,S,V])
image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB)
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# plt.figure(), plt.imshow(image)

Dx = cv2.Sobel(image,cv2.CV_8UC1,1,0)
Dy = cv2.Sobel(image,cv2.CV_8UC1,0,1)
M = cv2.addWeighted(Dx, 1, Dy,1,0)

# plt.subplot(1,3,1), plt.imshow(Dx, 'gray'), plt.title('Dx')
# plt.subplot(1,3,2), plt.imshow(Dy, 'gray'), plt.title('Dy')
# plt.subplot(1,3,3), plt.imshow(M, 'gray'), plt.title('Magnitude')

ret, binary = cv2.threshold(M,10,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# plt.figure(), plt.imshow(binary, 'gray')

binary = binary.astype(np.uint8)
binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20, 20)))
edges = cv2.Canny(binary, 50, 100)
# plt.figure(), plt.imshow(edges, 'gray')

lines = cv2.HoughLinesP(edges,1,3.14/180,50,20,10)[0]
output = np.zeros_like(M, dtype=np.uint8)
for line in lines:
    cv2.line(output,(line[0],line[1]), (line[2], line[3]), (100,200,50), thickness=2)
# plt.figure(), plt.imshow(output, 'gray')

points = np.array([np.transpose(np.where(output != 0))], dtype=np.float32)
rect = cv2.boundingRect(points)
cv2.rectangle(original,(rect[1],rect[0]), (rect[1]+rect[3], rect[0]+rect[2]),(255,255,255),thickness=2)
original = cv2.cvtColor(original,cv2.COLOR_BGR2RGB)
plt.figure(), plt.imshow(original,'gray')


plt.show()

注意:您可以取消注释行以显示每个步骤的结果! 我只是为了便于阅读而评论它们。

结果

结果图片

注意:如果您知道罐头的纵横比,可以更好地修复它!

我希望这会有所帮助。 祝好运 :)

  ask by user3553000 translate from so

未解决问题?本站智能推荐:

1回复

opencv检测光频率

我目前正在从事机器人汽车的业余爱好项目。 在摄像机的前面,我将放置2个光源,并且在计算机视觉下,我想检测光源并将我的机器人车放在它的前面。 在Raspberry Pi 3上使用Python和OpenCV时,我可以进行以下工作:我正在使用2个红色光源。 使用以下OpenCV函数:cvtC
3回复

通过视频检测物体位置

所以,我使用openCV进行基于颜色的物体检测,我在树莓派3上运行它。它正在工作,因为它实时跟踪网球(虽然它有一些延迟,因为我使用kinect v1(freenect库) ))。 现在我想确定找到的对象的位置。 我想知道它是在中间,还是在左边或更多在右边。 我想将相机镜架分成3个部分。
1回复

如何为树莓派增加fps以进行对象检测

我的树莓派上的实时对象检测速度偏低 我使用笔记本电脑窗口10在我自己的数据集上训练了yolo-darkflow对象检测。当我使用网络摄像头在便携式计算机上测试该模型以进行实时检测时,它可以在高fps下正常工作 但是,当尝试在运行于Raspbian操作系统上的raspberry pi上
1回复

如何在决策条件下使用对象检测边界框来使用C ++ OpenCV打开Raspberry Pi上的LED?

我正在使用OpenCV 2.4.8创建将检测枪支的应用程序。 该应用程序将部署在Raspberry Pi上。 LED /蜂鸣器也连接到Raspberry Pi。 如果检测到喷枪,则应根据特定条件打开LED /蜂鸣器。 我已经附上了相关代码。 问题是,如何告诉代码是否检测到了枪支? 我
1回复

在Raspberry PI 3中使用笔记本电脑中的模型时,Google的对象检测API错误

我已经在笔记本电脑和Raspberry PI模型3上实现了Google的对象检测API( https://github.com/tensorflow/models/tree/master/research/object_detection )。我设法训练了一个模型并运行了测试代码,以分别在PI和
2回复

在OpenCV中遇到方向检测问题

我正在尝试制作一个计算机视觉脚本来检测对象的方向。 它在大多数情况下都有效,但是对于某些图像似乎无法获得同样的成功。 该脚本依靠模糊和Canny边缘检测来找到轮廓。 工作示例: 失败的部分: 对于发生故障的部分,对于相同形状之一,有两条线,而完全忽略了其他
3回复

如何使用OpenCV从图像中检测旋转的对象?

我一直在训练OpenCV分类器来识别书籍。要求是从图像识别书籍。 我已经使用了1000多个图像,并且OpenCV能够不旋转地检测书籍。 但是,当我尝试旋转检测书籍时,它不能正常工作,所以我想知道它们是否仍然可以使用OpenCV检测图像中旋转对象?
1回复

OpenCV:对象检测

我的问题是关于任务的可行性 。 请注意,我已经阅读了此问题的解决方案,但是您可以猜测我在这里没有处理矩形和摄像机。 情况: 我需要将许多图片保存在一个文件夹中,所有图片均应遵循以下规则: 在每张图片中,只有一个对象。 物体可以是任何东西(汽车,马,人的手...
1回复

来自Python和C ++实现中的HOG对象检测的OpenCV结果不同

我已经使用OpenCV在Python和C ++中实现了HOG人脸检测器。 我试图使两个实现中的代码完全相同。 但是,在这两种方法上我得到了不同的结果。 在Python中,它可以正常工作,但是在C ++中,它显示的结果完全不正确。 下面是它们的输出示例(Python中的第一个输出,C ++
2回复

Python OpenCV-检测手

我们都喜欢哈尔级联。 此外,在Python OpenCV中, 检测输入图像中的面部非常简单: 但是,如何按照完全相同的方法来检测手 ? 我已经从互联网上搜索,下载和使用了很多xml文件,但是它们的性能都非常差。 谁能指出xml haarcascade文件用于手检测