Gimp程序中的OpenCV Python脚本-草/硬表面边缘检测
我想开发一个Python OpenCV脚本,以复制/改进我开发的Gimp过程。该过程的目标是提供一个x,y点阵列,该阵列沿着草和硬表面之间的分界线。这个阵列将允许我完成我的500磅54英寸宽的压力清洗机器人,它有一个树莓皮零(和摄像头),这样它就可以以每秒几英寸的速度沿着边缘移动。我将通过wifi视频流和iPhone应用程序监视和/或控制机器人,同时我在沙发上看电视 这是一个原始图像示例(60x80像素): Gimp程序是:Gimp程序中的OpenCV Python脚本-草/硬表面边缘检测,python,opencv,raspberry-pi,computer-vision,Python,Opencv,Raspberry Pi,Computer Vision,我想开发一个Python OpenCV脚本,以复制/改进我开发的Gimp过程。该过程的目标是提供一个x,y点阵列,该阵列沿着草和硬表面之间的分界线。这个阵列将允许我完成我的500磅54英寸宽的压力清洗机器人,它有一个树莓皮零(和摄像头),这样它就可以以每秒几英寸的速度沿着边缘移动。我将通过wifi视频流和iPhone应用程序监视和/或控制机器人,同时我在沙发上看电视 这是一个原始图像示例(60x80像素): Gimp程序是: 将图像转换为索引的2种颜色。基本上一边是草,另一边是砖块或人行道。该
好的,我终于有时间看一下了。我将阐述您的每一点,然后展示代码中的更改。如果您有任何问题或建议,请告诉我
...
start_time = time.time()
blur_img = cv2.GaussianBlur(img,(5,5),0) #here
# Use kmeans to convert to 2 color image
hsv_img = cv2.cvtColor(blur_img, cv2.COLOR_BGR2HSV)
...
...
allpnts = cv2.approxPolyDP(cnt,epsilon,True)
new_allpnts = []
for i in range(len(allpnts)):
a = (i-1) % len(allpnts)
b = (i+1) % len(allpnts)
if ((allpnts[i,0,0] == 0 or allpnts[i,0,0] == (img.shape[1]-1)) and (allpnts[i,0,1] == 0 or allpnts[i,0,1] == (img.shape[0]-1))):
tmp1 = allpnts[a,0] - allpnts[i,0]
tmp2 = allpnts[b,0] - allpnts[i,0]
if not (0 in tmp1 and 0 in tmp2):
new_allpnts.append(allpnts[i])
else:
new_allpnts.append(allpnts[i])
...
cv2.drawContours(pntscanvas, new_allpnts, -1, (0, 0, 255), 2)
...
...
#Extract contours from the mask
ret,thresh = cv2.threshold(mask,250,255,cv2.THRESH_BINARY) #here
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
...
...
cv2.imshow('mask.bmp',mask)
res2 = cv2.cvtColor(res2, cv2.COLOR_HSV2BGR)
cv2.imwrite('CvKmeans2Color.bmp',res2)
cv2.imshow('CvKmeans2Color.bmp',res2)
...
...
#Extract contours from the mask
ret,thresh = cv2.threshold(mask,250,255,cv2.THRESH_BINARY) #here
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
...
...
cv2.imshow('mask.bmp',mask)
res2 = cv2.cvtColor(res2, cv2.COLOR_HSV2BGR)
cv2.imwrite('CvKmeans2Color.bmp',res2)
cv2.imshow('CvKmeans2Color.bmp',res2)
...
免责声明:这些更改基于上面的python代码。对python代码的任何更改,如果不在“提供我的代码”中,则会使我的更改无效。我也可以查看此更改,但如果时间允许,可能要到明天晚些时候或周六上午才会发生。为了澄清,您只需要查找最大的绿色区域?事实上,为了找到另一种描述它的方法,我发现我的图像在最大的米色区域周围选择一系列色调(较低的色调值)进行分析更可靠在原始图像中。阴影似乎会影响使用哪种颜色的决定。然后在该遮罩上应用半径过滤器,然后将遮罩制作成多边形,然后删除相应的多边形点,以便剩余的点创建一条从边点到位图,然后再返回边点的连续路径。如此我的观点是,我将不得不暂停机器人,让它在到达栅栏门时等待指令。不确定算法在这种情况下会如何反应,我将获得该情况的图片并添加它。我可能只是在它变得混乱之前钉下一个红色反射器,在一个门或我的船坡道进水的地方等。这将是错误的y易于在脚本中添加红色反射器扫描。硬表面红色反射器可能会添加在硬表面的每个部分的末尾以停止机器人。还将有一个“任意方向”碰撞传感器来暂停它,并可能有一个“向下看”传感器来阻止它越过一步或进入池:)谢谢你解决了我的很多问题,但我不要认为我可以接受高斯模糊作为Gimp程序的复制/改进。我在Gimp中使用了各种模糊和过滤器,在草/硬表面边缘偏差误差的准确性方面效果有限。模糊确实提供了一些平滑,但代价是减少实际边缘像素上的色调变化梯度h我的眼睛可以在原始图像上插值。因此,用于创建遮罩的inRange像素选择的色调范围在找到我想要的真实路径时将不太有效。我的探索继续…换句话说,模糊不会“复制”Gimp过程,因为Gimp过程包括遮罩上的半径平滑,并且模糊不会由于上述原因,Gimp过程的“改进”。此外,2.没有得到解决,因为当我使用您所有的代码更改时,我仍然会得到位于图像边缘的额外“红色”数组点。2.的实际解决方案不会像删除图像角上的所有数组点那样简单,因为如果草/硬面线实际上是从图像角开始的。我将在获得一些代码/解决方案后处理此问题,该代码/解决方案适用于我的“左待处理”1的图像。我已在#2上编辑了我的答案。应删除边缘上的点,只要这两条线都是图像边缘的一部分。处理#1.G好主意,在#2上编码!!试试5的hsvdelta,你会发现我们开始得到更多的“红色”点,这些点不在草地边缘,将在5和更低的hsvdelta上用Gimps“边缘上的半径过滤器”删除。我们可能需要你编辑你的答案,而我,用脚注编辑我的问题以保持对话,让其他跟随者看到进展情况。如果我们将此移动到聊天,可以