Opencv 检测二值遮罩边缘时,轮廓结果不准确

Opencv 检测二值遮罩边缘时,轮廓结果不准确,opencv,Opencv,现在我有一个基于图像大小生成的遮罩,我有一组矩形来知道这些矩形在哪里,所以我尝试提取轮廓来知道这些矩形在哪里 再审 _, 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,-

现在我有一个基于图像大小生成的遮罩,我有一组矩形来知道这些矩形在哪里,所以我尝试提取轮廓来知道这些矩形在哪里

再审

_, 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))
但是没有虚荣

我不能精确地或近似地得到矩形尺寸 **请注意,生成的图像只是长过程的一小部分

第一个我检测到一些矩形,所以我将它们合并为第二个矩形,然后我应该在原始矩形中确定这个白色一维 正如所见,这也不准确
Python
c++
对我有好处
opencv3.x

以下是我得到的结果:

很明显,从这里你有非常清晰的轮廓,你可以打印出长度

使用此代码:

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);
Mat origImage=Mat;
Mat canny_输出=Mat;
矢量等值线;
向量层次;
cv::Mat greyMat,colorMat;
cv::CVT颜色(mat、灰色、cv_bgr2灰色);
int thresh=100;
RNG RNG(12345);
/////使用canny算法检测边缘
Canny(greyMat,Canny_输出,thresh,thresh*2,3);
///寻找轮廓
findContours(canny_输出、轮廓、层次、CV_RETR_树、CV_链近似_简单、点(0,0));
int最大面积=0;
int最大轮廓指数=0;
矩形边界;
///画轮廓
Mat drawing=Mat::zeros(canny_output.size(),CV_8UC3);
对于(int i=0;i最大面积){
最大面积=a;
最大轮廓指数=i;//存储最大轮廓指数
bounding_rect=boundingRect(轮廓[i]);//查找最大轮廓的边界矩形
}
}
矩形(原点、边界、标量(rng.uniform(0255)、rng.uniform(0255)、rng.uniform(0255)),2);
///陈列
namedWindow(“轮廓”,CV\u窗口\u自动调整大小);
调整大小(绘图,绘图,大小(640480));
调整大小(垫,垫,大小(640480));
调整大小(origImage,origImage,Size(640480));
imshow(“轮廓”,图纸);
简历:namedWindow(“img”);
cv::imshow(“mat”,mat);
cv::imshow(“mat”,原始图像);
cv::imshow(“mat123”,图纸);
cv::waitKey(0);

您得到了什么?您期望得到什么?您是否尝试过输出/显示结果?如果是,请在这里分享。我得到了错误的尺寸,而不是预期的尺寸。我添加了另一个例子
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);