gpt4 book ai didi

c++ - 尝试使用查找轮廓检测矩形

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:12 24 4
gpt4 key购买 nike

我正在尝试使用查找轮廓来检测矩形,但我没有从下图中获得任何轮廓。

我无法检测到图像中的任何轮廓。下图是不是发现轮廓不好,还是我应该使用霍夫变换。

更新:我更新了源代码以使用近似多边形。

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

enter image description here

我有另一种情况,即使在添加腐 eclipse 或膨胀时,当前的解决方案也不起作用。

image 2

这是代码

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);

最佳答案

您使用的代码看起来像来自 this question 的代码.

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

您的示例恰恰相反,因此您应该调整代码以使用 Binary 阈值类型(或取反图像)。

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

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

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

参见 this question用于比较此方法和寻找矩形的 Hough 方法。

编辑

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

您必须用选择最方形代替选择最大的轮廓。

关于c++ - 尝试使用查找轮廓检测矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37966823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com