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
C++ 尝试使用“查找轮廓”检测矩形_C++_Opencv_Computer Vision - Fatal编程技术网

C++ 尝试使用“查找轮廓”检测矩形

C++ 尝试使用“查找轮廓”检测矩形,c++,opencv,computer-vision,C++,Opencv,Computer Vision,我试图使用“查找轮廓”来检测矩形,但从下图中没有得到任何轮廓 我在图像中检测不到任何轮廓。是“查找轮廓”对下图不好,还是应该使用hough变换 更新:我已经更新了使用近似多边形的源代码 但是我仍然得到了异常值边界矩形,我找不到屏幕截图中最小的矩形 我有另一个例子,当前的解决方案,它不工作,甚至当增加侵蚀或膨胀 这是代码 using namespace cm; using namespace cv; using namespace std; cv::Mat inpu

我试图使用“查找轮廓”来检测矩形,但从下图中没有得到任何轮廓

我在图像中检测不到任何轮廓。是“查找轮廓”对下图不好,还是应该使用hough变换

更新:我已经更新了使用近似多边形的源代码

但是我仍然得到了异常值边界矩形,我找不到屏幕截图中最小的矩形

我有另一个例子,当前的解决方案,它不工作,甚至当增加侵蚀或膨胀

这是代码

using namespace cm;
    using namespace cv;
    using namespace std;


    cv::Mat input = cv::imread("heightmap.png");
    RNG rng(12345);
    // convert to grayscale (you could load as grayscale instead)
    cv::Mat gray;
    cv::cvtColor(input,gray, CV_BGR2GRAY);


    // compute mask (you could use a simple threshold if the image is always as good as the one you provided)
    cv::Mat mask;
    cv::threshold(gray, mask, 0, 255,CV_THRESH_OTSU);

    cv::namedWindow("threshold");
    cv::imshow("threshold",mask);

    // find contours (if always so easy to segment as your image, you could just add the black/rect pixels to a vector)
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(mask,contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    cv::Mat drawing = cv::Mat::zeros( mask.size(), CV_8UC3 );

    vector<vector<cv::Point> > contours_poly( contours.size() );
    vector<vector<cv::Point> > ( contours.size() );
    vector<cv::Rect> boundRect( contours.size() );
    for( int i = 0; i < contours.size(); i++ )
    {
        approxPolyDP( cv::Mat(contours[i]), contours_poly[i], 3, true );
        boundRect[i] = boundingRect( cv::Mat(contours_poly[i]) );
    }

     for( int i = 0; i< contours.size(); i++ )
    {
        cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
        rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );

    }

    // display
    cv::imshow("input", input);
    cv::imshow("drawing", drawing);
    cv::waitKey(0);
使用名称空间cm;
使用名称空间cv;
使用名称空间std;
cv::Mat input=cv::imread(“heightmap.png”);
RNG RNG(12345);
//转换为灰度(可以改为以灰度加载)
cv::席灰色;
cv::CVT颜色(输入,灰色,cv_bgr2灰色);
//计算掩码(如果图像始终与您提供的图像一样好,您可以使用一个简单的阈值)
cv::Mat面罩;
cv::阈值(灰色,遮罩,0,255,cv_THRESH_OTSU);
cv::namedWindow(“阈值”);
cv::imshow(“阈值”,掩码);
//查找轮廓(如果总是像图像那样容易分割,您可以将黑色/矩形像素添加到向量中)
矢量轮廓;
向量层次;
cv::findContours(遮罩、轮廓、cv_RETR_外部、cv_链_近似_简单);
cv::Mat drawing=cv::Mat::Zero(mask.size(),cv_8UC3);
向量等高线_多边形(等高线.size());
向量(contours.size());
向量boundRect(contours.size());
对于(int i=0;i
您正在使用的代码看起来像是源代码

它使用
BinaryInv
阈值,因为它在白色背景上检测黑色形状

您的示例正好相反,因此您应该调整代码,改为使用
Binary
threshold类型(或否定图像)

如果没有此修复,
FindContours
将检测图像的周长,这将是最大的轮廓

所以我不认为代码没有检测到轮廓,只是没有检测到您期望的“最大轮廓”

即使修复了这个问题,您发布的代码也无法将矩形与示例图像中的矩形匹配,因为最明显的矩形特性没有干净的边框。链接问题中的
approxPolyDP
建议可能会有所帮助,但您必须改进源图像

有关此方法与用于查找矩形的Hough方法的比较,请参见

编辑

您应该能够通过两次调用
corrove
(3x3)将示例图像中的矩形与其他blob分开


你必须选择最大的轮廓,而不是选择最平方的轮廓,所以你认为我应该使用hough变换而不是查找轮廓?因为我有不规则的形状?看情况。如果您可以使用
findContours
清理图像棒,因为它更稳定。什么是清理图像棒。我ḿ 一个初学者和我ḿ 学习。请尽量多解释,帮助我。非常感谢,对不起。。。那里应该有个逗号。如果可以清理图像,则
findContours
的效果会更好。查看我答案末尾的链接,比较两种方法。我如何清理图像?使用膨胀和侵蚀?这就是你的意思吗?