OPENCV C++ 找到最大内接矩形(正方形)

10 篇文章 0 订阅
1 篇文章 0 订阅

OPENCV-C++ 找到最大内接矩形(正方形)

这源代码本来是检测最大内接圆形的,本人想要矩形,所以变成了正方形;谨慎使用;不是严格意义上的最大内接矩形;

cv::Mat map_one_label = cv::imread("src.png",cv2.IMREAD_GRAYSCALE); //默认灰度图
std::vector<Rect> max_in_quare_rect  = get_max_in_quare_rec(map_one_label);
std::vector<Rect> get_max_in_quare_rec(Mat &map_one_label){

    std::vector<Rect> results;
    Rect ccomp;
    cv::Point center(map_one_label.cols / 2, map_one_label.rows / 2);

    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(map_one_label, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    for (int i = 0; i < contours.size(); i++)
    {
        Mat  dist = Mat::zeros(map_one_label.size(), CV_32F);		//定义一个Mat对象,存放原图中每个点到该轮廓的距离,为浮点型数据
        //遍历每个点,计算该点到轮廓距离
        for (int row = 0; row < map_one_label.rows; row++)
        {
            for (int col = 0; col < map_one_label.cols; col++)
            {
                //通过点多边形检测计算获得点到轮廓距离,并存放至dist中
                dist.at<float>(row, col) = pointPolygonTest(contours[i], Point(col, row), true);
            }
        }

        //计算dist中,最大值和最小值,以及其位置坐标
        double minVal, maxVal;
        Point maxloc, minloc;
        minMaxLoc(dist, &minVal, &maxVal, &minloc, &maxloc);
        int radio = abs(maxVal);			//对最大值求绝对值,即为内接圆半径
        cout << "haha " << radio << endl;
        Point center;

        center = maxloc;	//某点与轮廓距离为最大值,则该点为内接圆圆心
        cv::Point point_tl(center.x-radio , center.y-radio);
        cv::Point point_dr(center.x+radio , center.y+radio);
        cv::Rect rect1(point_dr , point_tl );
        results.push_back(rect1);

    }
    imshow("src", map_one_label);
    cv::waitKey(0);
    return results;

}

原图
在这里插入图片描述

检测结果:
在这里插入图片描述

加速版本可尝试

std::vector<Rect> get_max_in_quare_rec(Mat &map_one_label) {
    std::vector<Rect> results;
    std::vector<std::vector<Point>> contours;
    std::vector<Vec4i> hierarchy;

    // 使用 RETR_EXTERNAL 方式找到所有轮廓
    findContours(map_one_label, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    // 遍历每个轮廓
    for (int i = 0; i < contours.size(); i++) {
        // 获取当前轮廓的边界框
        Rect boundingBox = boundingRect(contours[i]);

        // 只在bounding box内计算距离
        Mat dist = Mat::zeros(boundingBox.size(), CV_32F);
        
        #pragma omp parallel for
        for (int row = 0; row < boundingBox.height; row++) {
            for (int col = 0; col < boundingBox.width; col++) {
                Point pt(col + boundingBox.x, row + boundingBox.y);
                dist.at<float>(row, col) = pointPolygonTest(contours[i], pt, true);
            }
        }

        // 找到距离最大的点
        double minVal, maxVal;
        Point maxloc, minloc;
        minMaxLoc(dist, &minVal, &maxVal, &minloc, &maxloc);
        int radius = std::abs(static_cast<int>(maxVal));

        // 确定内接圆的圆心及其矩形框
        Point center = maxloc + Point(boundingBox.x, boundingBox.y);
        cv::Point point_tl(center.x - radius, center.y - radius);
        cv::Point point_dr(center.x + radius, center.y + radius);
        cv::Rect rect1(point_tl, point_dr);
        results.push_back(rect1);
    }

    // 可视化结果
    imshow("src", map_one_label);
    cv::waitKey(0);

    return results;
}

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: OpenCV是一个开源计算机视觉库,提供了许多用于图像处理和计算机视觉的函数。其一个函数是查找图像最大内接矩形最大内接矩形是图像最大的能够完全包含在其矩形,该矩形的边界不能穿过任何图像边缘或者其他对象的边界。在OpenCV,可以使用函数minAreaRect来查找最大内接矩形。 该函数的参数是一个轮廓。轮廓是一组通过连续边界连接在一起的点的集合。函数将返回一个矩形数据结构,其包含了最大内接矩形的具体位置和大小。 要找到完全包含该轮廓的最大矩形,可以将所返回的矩形进行旋转。旋转的角度可以通过该矩形的角度(即旋转角度)来确定。在大多数情况下,用户只需要关心最大内接矩形的位置和大小即可。 总之,opencv最大内接矩形函数minAreaRect是一种用于查找图像最大的能够完全包含在其矩形的方法,并且该函数能够返回该矩形的具体位置和大小,这对于计算机视觉与图像处理来说有着很高的应用价值。 ### 回答2: OpenCV是一款开源的计算机视觉库,提供了许多针对图像处理和计算机视觉问题的函数和算法。其最大内接矩形是一种常用的图像处理方法,可以用来提取图像的目标区域。下面简单介绍一下OpenCV最大内接矩形算法。 最大内接矩形算法是基于轮廓图像的,因此在利用OpenCV实现时,需要先进行轮廓检测。找到轮廓之后,就可以使用cv::minAreaRect()函数来求解最小矩形轮廓。在最小矩形轮廓求解出来后,我们只需要将其旋转回原来的位置,就可以得到最大内接矩形。 具体实现方法如下: 首先,使用cv::findContours()函数来检测图像的轮廓,在检测之前需要进行图像二值化。接着,使用cv::minAreaRect()函数来求解最小矩形轮廓。最后,使用cv::boxPoints()函数将最小矩形转换为矩形的四个顶点坐标,然后使用cv::RotatedRect()函数对矩形进行旋转操作,最终得到最大内接矩形。 需要注意的是,最大内接矩形并不是唯一的,可能会存在多个满足条件的矩形。因此,在实际应用需要根据具体需求选择合适的矩形。另外,最大内接矩形算法对于含有弯曲结构的轮廓可能无法求解,需要进一步的处理。 综上所述,OpenCV提供了方便实用的最大内接矩形算法,可以帮助开发者更好地解决图像处理和计算机视觉问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值