gpt4 book ai didi

c++ - 删除面积 < n OpenCV 的边界矩形

转载 作者:太空宇宙 更新时间:2023-11-04 16:15:41 25 4
gpt4 key购买 nike

我正在腐 eclipse 上面带有文本 block 的图像,然后使用 findContours() 查找所有文本 block ,然后绘制它们的边界矩形。然而,有时图像中的噪声会产生非常小的矩形,这些矩形要么在更大的矩形中,要么在没有文本的地方。

我正在使用此代码查找轮廓并绘制它们。

double element_size = 20;
RNG rng(12345);
Mat element = getStructuringElement( cv::MORPH_ELLIPSE,cv::Size( 2*element_size + 1, 2*element_size+1 ),cv::Point( element_size, element_size ) );
erode(quad, quad, element);
vector<vector<cv::Point> > contours;
vector<Vec4i> hierarchy;
quad.convertTo(quad, CV_8UC1);
findContours( quad, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );

vector<vector<cv::Point> > contours_poly( contours.size() );
vector<cv::Rect> boundRect( contours.size() );

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

Mat drawing = Mat::zeros( quad.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar(0,255, 0 );
rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
}

这里是示例运行后我得到的结果:

enter image description here

如何修改我的代码,以便我可以删除任何不大于 n 的矩形,这样我只能保留完整的文本 block ,我还需要删除围绕整个文本 block 的最大轮廓卡片。

最佳答案

你可以使用 contourArea要消除轮廓,请在找到边界矩形之前使用以下代码,这将删除所有面积小于阈值的轮廓。

double min_area=100; // area threshold

for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
{
double area=contourArea( contours[i],false); // Find the area of contour
if(area<min_area)
contours.erase(contours.begin() + i);
}

编辑:-

对于任何要使用上述代码的人,请参阅下面的评论。

关于c++ - 删除面积 < n OpenCV 的边界矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976765/

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