当前位置: 首页 > 知识库问答 >
问题:

无法使用findcontours和opencv查找所有轮廓

向泽语
2023-03-14

我试图找到使用opencv findcontour的轮廓,但一些轮廓丢失了一个相当简单的图像。图像是在create_mat()函数中创建的,在rbt中使用findcontour。我曾尝试改变模式findcontour使用:CV_RETR_EXTERNAL,CV_RETR_LIST...我都试过了,改变方法:CV_CHAIN_APPROX_NONE......

opencv版本是3.3

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc.hpp"
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define SIZE_XX 750
#define SIZE_YY 3000
int im_mat[SIZE_XX][SIZE_YY];
cv::Mat create_mat(){
    for(int i=0;i <SIZE_XX;i++){
        int index=0;
        for(int j=0;j<SIZE_YY;j++){
            im_mat[i][j] = 0;
        }
    }
    Mat circle1 = cv::Mat(SIZE_XX,SIZE_YY,CV_8UC1,im_mat);
    int thickness = -1;
    int lineType = 8;
    circle( circle1,Point(10,60),25,Scalar(255),thickness,lineType );
    circle( circle1,Point(35,10),25,Scalar(255),thickness,lineType );
    rectangle( circle1,Point( 200,400),Point( 500, 600),Scalar( 255 ),-1,8 );
    circle( circle1,Point(350,35),25,Scalar(255),thickness,lineType );
    rectangle( circle1,Point( 1500,500),Point( 2098, 600),Scalar( 255 ),-1,8 );
    circle( circle1,Point(35,160),25,Scalar(255),thickness,lineType );
    circle( circle1,Point(2000,160),25,Scalar(255),thickness,lineType );
    rectangle( circle1,Point( 1000,0),Point( 1100, 200),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 1800,25),Point( 1650, 200),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 200,200),Point( 300, 300),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 625,625),Point( 825, 750),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 1300,35),Point( 1450, 400),Scalar( 255 ),-1,8 );
    return circle1;
}
void rbt(){
    Mat src= create_mat();
    Mat oi,oi2,oi3,oi4;
    src.copyTo(oi);
    cv::resize(oi, oi, cv::Size(), 0.5, 0.5);
    cv::imshow("test1",oi);
    cv::waitKey(1000);
    Mat gray;
    threshold(src, gray,0, 255,THRESH_BINARY);
    cv::resize(gray, oi2, cv::Size(), 0.5, 0.5);
    imshow("grays",oi2);
    Rect bounding_rect;
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    Mat cpy;
    gray.copyTo(cpy);

    findContours( cpy, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE  );

    RNG rg(12345);
    Mat destination(gray.rows, gray.cols, CV_8UC3, Scalar(255, 255, 255));
    for( int i = 0; i< contours.size(); i++ )
    {
        Scalar color = Scalar( rg.uniform(75, 175), rg.uniform(75,175), rg.uniform(75,175) );
        drawContours( destination, contours, i, color, -1,8,hierarchy );
        cv::resize(destination, oi3, cv::Size(), 0.5, 0.5);
        cv::imshow("drawing",oi3);
        cv::waitKey(1000);
    }
    waitKey(0);                                         
} 

我也尝试过先用canny找到边缘,但结果更糟。

图像为黑色背景,白色物体用于查找轮廓。

我的轮廓图像丢失:(35,10)和(350,35)处的圆形加上(1000,0)处的矩形。

共有1个答案

盖马鲁
2023-03-14

你的代码对我来说运行良好!

我建议您提供更多关于输出图片不起作用的细节,并检查是否链接到所有库等。

我所做的只是将代码复制并粘贴到我的Visual Studio OpenCV 3.3.0测试环境中。

 类似资料:
  • 我想,我很理解函数“cv2.FindOntours(图像、模式、方法)。但我在opencv的一个文档中得到了这个东西轮廓,层次=cv2.FindOntours(thresh,2,1)。我不明白这里2,1的含义以及为什么使用它们。请有人解释一下。

  • 我正在开发一个程序,提取拼图上的贴纸,然后再找到它们的RGB。目前,我正处于要删除任何非“方形”轮廓的位置。我想知道我怎么能做到这一点。 我所做的就是加载图像,使其变灰,模糊,精明的边缘检测,放大它,找到轮廓并绘制它们。 有没有一种方法可以让我在轮廓周围画出而不是填充它们?并删除周围大小不大致相同或几乎有90度角的轮廓? 这是初始图像: 以下是绘制轮廓的图像:

  • 本文向大家介绍如何使用Java OpenCV库查找图像轮廓?,包括了如何使用Java OpenCV库查找图像轮廓?的使用技巧和注意事项,需要的朋友参考一下 轮廓线不过是连接沿着特定形状的边界的所有点的线。使用这个你可以- 查找对象的形状。 计算对象的面积。 检测物体。 识别对象。 您可以使用findContours()方法找到图像中各种形状的轮廓,对象。此方法接受以下参数- 二进制图像。 类型为M

  • 我工作在python在openCV 3.0.为了找到最大的白色像素区域,首先将阈值灰度图像转换为二值图像。 但它显示错误如下。 cv2。错误:/opencv/modules/imgproc/src/等高线。cpp:198:错误:(-210)[Start]FindContours在模式下仅支持CV_8UC1图像!=CV_RETR_FLOODFILL仅在函数cvStartFindContours中支持

  • 我试图对我的图像进行预处理,以便最终从预处理后的图像中找到轮廓。 它给了我一个错误说明:OpenCV错误:cvStartFindContours中不支持的格式或格式组合([Start]FindContours在模式下仅支持CV_8UC1图像!=CV_RETR_FLOODFILL,否则仅支持CV_32SC1图像) 我用的是opencv3.0

  • 如何使用节点扫描AWS dynamodb中的所有项目。js。我在这里张贴我的代码。 我已经跟踪了链接https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.04.html 过了一会儿我就有时间离开这里了。我也检查了这个链接,如何使用节点从“AWS dynamodb”获取/扫描所有项