检测二进制掩码边缘的轮廓结果不准确

时间:2018-04-19 15:20:11

标签: opencv

现在我根据图像的大小生成了这个蒙版,我有一组矩形来知道这些矩形在哪里,所以我试图提取轮廓以了解这些矩形在哪里...

mask generated

 mask = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)  # Mask of original image
 #some process to draw these rectangles merged...
 _, bw = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY)
 img, contours, hierarchy = cv2.findContours(bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
 for j in range(len(contours)):
        outputBoxes.append(cv2.boundingRect(contours[j]))

另一项试验

_, bws = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY)
img, contours, hierarchy = cv2.findContours(bws, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE, offset=(0,0))
cv2.drawContours(bws, contours,-1,(255,255,0))
img, contours, hierarchy = cv2.findContours(bws, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE, offset=(0,0))

但没有白费

我无法准确或甚至大致得到矩形尺寸 **注意这个生成的图像只是长过程的一小部分

second example 第一个我检测到一些rects所以我把它们合并为第二个然后我应该把这个白色的一个尺寸确定在原来的一个 如图所示,它也不准确 Pythonc++对我有好处 opencv 3.x

1 个答案:

答案 0 :(得分:1)

以下是我得到的结果:

enter image description here

显然,从这里你有清晰的轮廓,你可以打印出长度。

使用此代码:

Mat origImage = mat;
    Mat canny_output = mat;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    cv::Mat greyMat, colorMat;
    cv::cvtColor(mat, greyMat, CV_BGR2GRAY);
    int thresh = 100;
    RNG rng(12345);
    ///// Detect edges using canny
    Canny(greyMat, canny_output, thresh, thresh * 2, 3);
    /// Find contours
    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    int largest_area = 0;
    int largest_contour_index = 0;
    Rect bounding_rect;
    /// Draw contours
    Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
    for (int i = 0; i< contours.size(); i++)
    {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
        double a=contourArea( contours[i],false);  //  Find the area of contour
       if(a>largest_area){
       largest_area=a;
       largest_contour_index=i;                //Store the index of largest contour
       bounding_rect=boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
       }
    }
    rectangle(origImage, bounding_rect, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)),2);
    /// Show in a window
    namedWindow("Contours", CV_WINDOW_AUTOSIZE);
    resize(drawing, drawing, Size(640, 480));
    resize(mat, mat, Size(640, 480));
    resize(origImage, origImage, Size(640, 480));
    imshow("Contours", drawing);

    cv::namedWindow("img");
    cv::imshow("mat", mat);
    cv::imshow("mat", origImage);
    cv::imshow("mat123", drawing);
    cv::waitKey(0);