C++ OpenCV如何实现轮廓周围矩形和圆形绘制

发布时间:2021-11-26 10:14:41 作者:小新
来源:亿速云 阅读:525

C++ OpenCV如何实现轮廓周围矩形和圆形绘制

在图像处理和计算机视觉领域,轮廓检测是一个常见的任务。OpenCV强大的开源计算机视觉库,提供了丰富的函数来处理图像和检测轮廓。本文将介绍如何使用C++和OpenCV实现轮廓周围矩形和圆形的绘制。

1. 准备工作

在开始之前,确保你已经安装了OpenCV库,并且配置好了开发环境。你可以通过以下命令安装OpenCV:

sudo apt-get install libopencv-dev

2. 轮廓检测

首先,我们需要加载图像并检测轮廓。OpenCV提供了findContours函数来检测图像中的轮廓。以下是一个简单的代码示例:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // 加载图像
    Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
    if (image.empty()) {
        cout << "Could not open or find the image" << endl;
        return -1;
    }

    // 二值化图像
    Mat binary;
    threshold(image, binary, 127, 255, THRESH_BINARY);

    // 查找轮廓
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(binary, contours, hierarchy, RETR_TREE, CHN_APPROX_SIMPLE);

    // 绘制轮廓
    Mat contourImage = Mat::zeros(image.size(), CV_8UC3);
    for (size_t i = 0; i < contours.size(); i++) {
        drawContours(contourImage, contours, i, Scalar(0, 255, 0), 2);
    }

    // 显示结果
    imshow("Contours", contourImage);
    waitKey(0);

    return 0;
}

在这个示例中,我们首先加载图像并将其转换为灰度图像。然后,我们使用threshold函数将图像二值化。接下来,我们使用findContours函数检测轮廓,并使用drawContours函数绘制轮廓。

3. 绘制轮廓周围的矩形

在检测到轮廓后,我们可以使用boundingRect函数计算轮廓的最小外接矩形,并使用rectangle函数绘制矩形。以下是代码示例:

// 绘制轮廓周围的矩形
for (size_t i = 0; i < contours.size(); i++) {
    Rect rect = boundingRect(contours[i]);
    rectangle(contourImage, rect, Scalar(255, 0, 0), 2);
}

// 显示结果
imshow("Contours with Rectangles", contourImage);
waitKey(0);

在这个示例中,我们遍历所有轮廓,使用boundingRect函数计算每个轮廓的最小外接矩形,并使用rectangle函数绘制矩形。

4. 绘制轮廓周围的圆形

类似地,我们可以使用minEnclosingCircle函数计算轮廓的最小外接圆,并使用circle函数绘制圆形。以下是代码示例:

// 绘制轮廓周围的圆形
for (size_t i = 0; i < contours.size(); i++) {
    Point2f center;
    float radius;
    minEnclosingCircle(contours[i], center, radius);
    circle(contourImage, center, radius, Scalar(0, 0, 255), 2);
}

// 显示结果
imshow("Contours with Circles", contourImage);
waitKey(0);

在这个示例中,我们遍历所有轮廓,使用minEnclosingCircle函数计算每个轮廓的最小外接圆,并使用circle函数绘制圆形。

5. 完整代码

以下是完整的代码示例,包括轮廓检测、绘制轮廓周围的矩形和圆形:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // 加载图像
    Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
    if (image.empty()) {
        cout << "Could not open or find the image" << endl;
        return -1;
    }

    // 二值化图像
    Mat binary;
    threshold(image, binary, 127, 255, THRESH_BINARY);

    // 查找轮廓
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(binary, contours, hierarchy, RETR_TREE, CHN_APPROX_SIMPLE);

    // 绘制轮廓
    Mat contourImage = Mat::zeros(image.size(), CV_8UC3);
    for (size_t i = 0; i < contours.size(); i++) {
        drawContours(contourImage, contours, i, Scalar(0, 255, 0), 2);
    }

    // 绘制轮廓周围的矩形
    for (size_t i = 0; i < contours.size(); i++) {
        Rect rect = boundingRect(contours[i]);
        rectangle(contourImage, rect, Scalar(255, 0, 0), 2);
    }

    // 绘制轮廓周围的圆形
    for (size_t i = 0; i < contours.size(); i++) {
        Point2f center;
        float radius;
        minEnclosingCircle(contours[i], center, radius);
        circle(contourImage, center, radius, Scalar(0, 0, 255), 2);
    }

    // 显示结果
    imshow("Contours with Rectangles and Circles", contourImage);
    waitKey(0);

    return 0;
}

6. 总结

本文介绍了如何使用C++和OpenCV实现轮廓周围矩形和圆形的绘制。通过findContours函数检测轮廓,使用boundingRectminEnclosingCircle函数计算轮廓的最小外接矩形和圆形,并使用rectanglecircle函数绘制矩形和圆形。这些技术在图像处理和计算机视觉中非常有用,可以用于目标检测、形状分析等任务。希望本文对你有所帮助!

推荐阅读:
  1. opencv3/C++轮廓的提取与筛选方式
  2. C++ OpenCV如何实现轮廓发现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ opencv

上一篇:C++ OpenCV如何判断点是否在给定的轮廓中

下一篇:C#如何实现基于Socket套接字的网络通信封装

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》