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 2.7 使用OpenCV查找连接的组件_Python 2.7_Opencv_Edge Detection_Connected Components - Fatal编程技术网

Python 2.7 使用OpenCV查找连接的组件

Python 2.7 使用OpenCV查找连接的组件,python-2.7,opencv,edge-detection,connected-components,Python 2.7,Opencv,Edge Detection,Connected Components,我正在尝试使用python OpenCV查找并分离边缘检测图像中的所有边缘。边缘可以是轮廓的形式,但它们不必是轮廓。我只想把所有连接的边和像素组合在一起。因此,从技术上讲,算法在程序上可能是这样的: 对于每个边缘像素,找到一个相邻的(连接的)边缘像素并将其添加到图像的当前细分中,直到再也找不到为止 然后移动到下一个未选中的边缘像素,开始新的细分,然后再次执行1) 我查看了cv.findContours,但结果并不令人满意,可能是因为它是用于轮廓(封闭边)而不是自由端的。结果如下: 检测到原始边缘

我正在尝试使用python OpenCV查找并分离边缘检测图像中的所有边缘。边缘可以是轮廓的形式,但它们不必是轮廓。我只想把所有连接的边和像素组合在一起。因此,从技术上讲,算法在程序上可能是这样的:

  • 对于每个边缘像素,找到一个相邻的(连接的)边缘像素并将其添加到图像的当前细分中,直到再也找不到为止
  • 然后移动到下一个未选中的边缘像素,开始新的细分,然后再次执行1)
  • 我查看了
    cv.findContours
    ,但结果并不令人满意,可能是因为它是用于轮廓(封闭边)而不是自由端的。结果如下:

    检测到原始边缘:

    轮廓处理后:

    我原以为这五条边都会被分成自己的图像细分,但显然cv2.findContours函数会将其中两条边进一步细分为我不想要的细分

    以下是我用来保存这两幅图像的代码:

        def contourForming(imgData):
          cv2.imshow('Edge', imgData)
          cv2.imwrite('EdgeOriginal.png', imgData)
          contours = cv2.findContours(imgData, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
          cv2.imshow('Contours', imgData)
          cv2.imwrite('AfterFindContour.png', imgData)
          cv2.waitKey(0)
          pass
    
    然而,我的实现有一些限制。我必须使用Python2.7和OpenCV2。除此之外,我不能使用任何其他版本或语言。我之所以这么说是因为我知道OpenCV 2有一个使用C++的连接组件函数。我本可以使用它,但问题是,由于某些限制,我无法使用它

    那么,你知道我应该如何处理这个问题吗?

    使用是正确的方法,你只是做错了

    仔细查看文档:

    注意:此函数修改源图像

    您的“轮廓处理后”图像实际上是来自
    findContours
    的垃圾结果。因此,如果您希望在调用
    findContours
    后原始图像保持完整,通常的做法是将克隆图像传递给函数

    findContours
    的有意义的结果是在
    等高线中。您需要使用
    绘制轮廓
    ,通常在新图像上绘制轮廓

    这是我得到的结果:

    以下C++代码:

    #include <opencv2/opencv.hpp>
    using namespace cv;
    
    int main(int argc, char** argv)
    {
        // Load the grayscale image
        Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
    
        // Prepare the result image, 3 channel, same size as img, all black
        Mat3b res(img.rows, img.cols, Vec3b(0,0,0));
    
        // Call findContours
        vector<vector<Point>> contours;
        findContours(img.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    
        // Draw each contour with a random color
        for (int i = 0; i < contours.size(); ++i)
        {
            drawContours(res, contours, i, Scalar(rand() & 255, rand() & 255, rand() & 255));
        }
    
        // Show results
        imshow("Result", res);
        waitKey();
    
        return 0;
    }
    
    #包括
    使用名称空间cv;
    int main(int argc,字符**argv)
    {
    //加载灰度图像
    Mat1b img=imread(“路径到图像”,imread\U灰度);
    //准备结果图像,3通道,与img尺寸相同,全黑
    Mat3b res(img.rows,img.cols,Vec3b(0,0,0));
    //呼叫发现者
    矢量等值线;
    findContours(img.clone()、轮廓、外部修复、链近似无);
    //用随机颜色绘制每个轮廓
    对于(int i=0;i

    移植到Python应该相当容易(很抱歉,我不能给您Python代码,因为我无法测试它)。您还可以查看特定的,以检查如何正确使用
    findContours
    drawContours

    您可以在提取轮廓之前尝试cv::放大边缘,但这可能会改变结果!我想现在可以了。我不知道您提供的opencv3.0.0文档()也适用于opencv2.7。