我想用某种机器学习来测量(直径)和计算传送带上的土豆。我已经开始使用opencv,并开始训练带有正片和负片图像的层叠,这是我捕获的短视频的打印屏幕:
在这个框架中,它只能识别一些土豆,但我认为我可以添加更多的正面和负面图像,使更好的标识符。你知道吗
关于这些问题
你认为我说的对吗?
你知道我该怎么继续测量直径吗?
我该如何跟踪每一个土豆,使它只被计算一次?
(这是我用来识别土豆的代码)
import numpy as np
import cv2
pot_cascade = cv2.CascadeClassifier('cascade.xml')
cap = cv2.VideoCapture('potatoe_video.mp4')
while 1:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
potatoes = pot_cascade.detectMultiScale(gray, 5, 5)
for (x, y, w, h) in potatoes:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 0), 2)
cv2.imshow('img', img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
是的,也不是。机器学习绝对是解决土豆跟踪问题的正确工具,但到目前为止显示的结果并不是很好。还有很长的路要走。你知道吗
如果你只对测量土豆的平均直径感兴趣,那么这可能比跟踪单个土豆要容易得多。你知道吗
首先,您需要估计透视图(传送带相对于相机的位置),以便了解图像空间与传送带上真实空间的关系。什么可以帮助你找出真正的空间到图像空间的转换是把一个规则的网格(一张有规则的黑色圆点的纸)放在皮带上,观察它的运动。在俯视模式下安装相机可能会使事情变得更简单。你知道吗
只测量平均直径意味着你不需要把每一个土豆都弄对,一个标准的边缘检测算法可能足以检测出大部分土豆,然后将椭圆拟合到它们身上,制作直径直方图并查看中值。你知道吗
或者计算土豆亮度的自相关(土豆之间,它是暗的,土豆本身反射光),并拟合自相关中的峰宽。或者计算图像的傅里叶变换,并在一个频带内对平均振幅进行归一化,在该频带内,您可以使用另一个频带的平均振幅来预测土豆的大小。如果你能用已知大小的土豆来校准这个方法,这是最有效的。这意味着您可以记录已知不同大小的土豆,从而校准自相关或基于FFT的度量。你知道吗
我会选择机器学习方法,因为它有可能给你一个土豆的测量值。你知道吗
在视频的时间范围内,每一个土豆都是可见的(潜在的),这是传送带上的土豆通过视野所需要的。一旦确定了透视图,就可以将图像中的位置和录制时间与传送带上的位置联系起来,只要土豆不改变传送带上的位置,就可以在整个可见时间范围内轻松识别它。你知道吗
你基本上必须知道(估计)运输带的移动,然后你可以“撤消”它(计算)和平均所有发生在你看到同一个土豆。你知道吗
我建议采用以下一般工作流程:
相关问题 更多 >
编程相关推荐