Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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

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
Gimp程序中的OpenCV Python脚本-草/硬表面边缘检测_Python_Opencv_Raspberry Pi_Computer Vision - Fatal编程技术网

Gimp程序中的OpenCV Python脚本-草/硬表面边缘检测

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种颜色。基本上一边是草,另一边是砖块或人行道。该

我想开发一个Python OpenCV脚本,以复制/改进我开发的Gimp过程。该过程的目标是提供一个x,y点阵列,该阵列沿着草和硬表面之间的分界线。这个阵列将允许我完成我的500磅54英寸宽的压力清洗机器人,它有一个树莓皮零(和摄像头),这样它就可以以每秒几英寸的速度沿着边缘移动。我将通过wifi视频流和iPhone应用程序监视和/或控制机器人,同时我在沙发上看电视

这是一个原始图像示例(60x80像素):

Gimp程序是:

  • 将图像转换为索引的2种颜色。基本上一边是草,另一边是砖块或人行道。该死的阴影哦,这是我:)
  • 在这两种颜色中,取较低的色调值,并在该值的像素上使用魔杖,使用下面的魔杖设置。色调设置为23表示如何移除阴影,羽毛设置为15表示如何移除孤岛/锯齿(裂缝中的草:)
  • 使用以下高级设置值对路径进行高级选择(默认值的更改为黄色)。基本上,我只需要线段,我的(x,y)点阵列将是黄色的路径点
  • 接下来,我将路径导出到一个.xml文件,从中我可以解析并分离上图中的黄点。以下是.xml文件:

  • 好的,我终于有时间看一下了。我将阐述您的每一点,然后展示代码中的更改。如果您有任何问题或建议,请告诉我

  • 看来你自己能做得很好

    1.a.在对图像进行任何处理之前,可以通过模糊图像来解决这一问题。为了实现这一点,对代码进行了以下更改:

    ...
    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)
    ...
    
  • 至于颜色差异,您已将图像转换为HSV格式,在保存之前,您不会将其切换回BGR。对HSV的此更改确实会给您带来更好的效果,因此我会保留它,但它是一个不同的调色板。更改如下:

    ...
    #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“边缘上的半径过滤器”删除。我们可能需要你编辑你的答案,而我,用脚注编辑我的问题以保持对话,让其他跟随者看到进展情况。如果我们将此移动到聊天,可以