文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

OpenCV如何实现绘制轮廓外接矩形

2023-07-04 22:00

关注

本篇内容介绍了“OpenCV如何实现绘制轮廓外接矩形”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.寻找轮廓

api

void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point()

各个参数详解如下:

Image表示输入图像,必须是二值图像,二值图像可以threshold输出、Canny输出、inRange输出、自适应阈值输出等。

Contours获取的轮廓,每个轮廓是一系列的点集合

Hierarchy轮廓的层次信息,每个轮廓有四个相关信息,分别是同层下一个、前一个、第一个子节点、父节点

mode 表示轮廓寻找时候的拓扑结构返回 -RETR_EXTERNAL表示只返回最外层轮廓 -RETR_TREE表示返回轮廓树结构

Method表示轮廓点集合取得是基于什么算法,常见的是基于CHAIN_APPROX_SIMPLE链式编码方法

注意,如果图像底色是白色,则检测最外层的轮廓为图像边框

2.绘制轮廓外接矩形

绘制外接矩形包括两种:

绘制最大外接矩形

(Rect cv::boundingRect( InputArray points ))

其中,输入参数points为一系列点的集合(findContours中contours中的一个元素),对轮廓来说就是该轮廓的点集 返回结果是一个矩形,x, y, w, h

绘制最小外接矩形

RotatedRect cv::minAreaRect( InputArray points )

其中,输入参数points为一系列点的集合(findContours中contours中的一个元素) ,对轮廓来说就是该轮廓的点集 返回结果是一个旋转矩形,包含下面的信息: - 矩形中心位置 - 矩形的宽高 - 旋转角度。

3.代码

EdgeDetection.h

#pragma once#include<opencv2/opencv.hpp>#include<iostream>using namespace std;using namespace cv;class EdgeDetection{    cv::Mat m_img;    cv::Mat m_canny;public:    EdgeDetection(cv::Mat iamge);    bool cannyProcess(unsigned int downThreshold,unsigned int upThreshold);    bool getContours();    ~EdgeDetection();};

EdgeDetection.cpp

#include "EdgeDetection.h"EdgeDetection::EdgeDetection(cv::Mat image){    m_img = image;}bool EdgeDetection::cannyProcess(unsigned int downThreshold, unsigned int upThreshold){    bool ret=true;    if (m_img.empty())    {        ret = false;    }    cv::Canny(m_img, m_canny, downThreshold, upThreshold);    cv::imshow("Canny", m_canny);    return ret;}bool EdgeDetection::getContours(){    bool ret = true;    if (m_canny.empty())    {        ret = false;    }    cv::Mat k = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3), cv::Point(-1, -1));    cv::dilate(m_canny, m_canny, k);    imshow("dilate", m_canny);    // 轮廓发现与绘制    vector<vector<cv::Point> > contours;    vector<Vec4i> hierarchy;    findContours(m_canny, contours, cv::RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());    for (size_t i = 0; i < contours.size();++i)    {        // 最大外接轮廓        cv::Rect rect = cv::boundingRect(contours[i]);        cv::rectangle(m_img,rect,cv::Scalar(0,255,0),2,LINE_8);        // 最小外接轮廓        RotatedRect rrt = minAreaRect(contours[i]);        Point2f pts[4];        rrt.points(pts);        // 绘制旋转矩形与中心位置        for (int i = 0; i < 4; i++) {            line(m_img, pts[i % 4], pts[(i + 1) % 4], Scalar(0, 0, 255), 2, 8, 0);        }        Point2f cpt = rrt.center;        circle(m_img, cpt, 2, Scalar(255, 0, 0), 2, 8, 0);    }    imshow("contours", m_img);    return ret;}EdgeDetection::~EdgeDetection(){}

main.cpp

#include"EdgeDetection.h"using namespace std;using namespace cv;int main(int argc, char* argv[]){    Mat src = imread("rect.jpg");    if (src.empty())    {        cout << "image is empty" << endl;        return -1;    }    imshow("input", src);    EdgeDetection ed(src);    ed.cannyProcess(80,160);    ed.getContours();    waitKey(0);    return 0;}

“OpenCV如何实现绘制轮廓外接矩形”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯