当前位置: 首页 > news >正文

RV1126 NO.39:OPENCV查找图形轮廓并画框

一.实战简介

经过上一章节的讲解,我们对整个OPENCV提取轮廓的API有了一个大致的了解。本章节主要是讲解如何通过代码来实现OPENCV的轮廓检测提取然后进行画框。具体的如下图:

上面是我们整个代码的第一步,调用imread的API读取本地的三通道图片。

完成轮廓检测,需要做以上步骤。分别是imread读取图片(这个图片默认是3通道)、利用cvtColor把8VU3的三通道图片转换成灰度图(8VU1)、调用Canny对灰度图像进行边缘检测、调用findContours去查找轮廓、循环轮廓数量然后调用drawContours进行画框操作。

二.对代码进行拆分讲解

2.1. 读取需要处理的图片

Mat img = imread("shape.png"); //读取shape图片

上面是我们整个代码的第一步,调用imread的API读取本地的三通道的代码。

2.2. 对图片进行灰度处理并进行边缘检测

Mat imgGray;
cvtColor(img, imgGray, COLOR_RGB2GRAY); //把彩色图像转换成GRAY灰度图

由于读取到的图片是三通道的图像,所以我们要把三通道的图像利用cvtColor的方式进行灰度处理,然后再调用Canny对灰度图像进行边缘检测处理。最小阈值threadhold1是25,最大阈值threadhold2是75;大于75表示的是强边缘需要保存下来的,小于25是弱边缘需要忽略的,25-75之间的边缘则会用算法进行候选。

2.3. 调用findContours去查找图像轮廓

findContours(imgCanny, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE); //查询轮廓,MODE是外部轮廓检测RETR_EXTERNAL,method是CHAIN_APPROX_NONE

处理完边缘后,就findContours可以通过findContours去查找所有图像的轮廓了,由于我们检测的图像没有内嵌的形状,所以我们选择RETR_EXTERNAL的模式只检测外轮廓,Method的方法则选择CHAIN_APPROX_SIMPLE存储所有的轮廓点。注意:contours一般是用vector<vector<point>>表示,hierarchy通常用vector<Vec4i>表示,它都是由点的集合来保存的.

2.4. 获取轮廓数量后循环并且保存

  Mat drawing = Mat::zeros(imgCanny.size(), CV_8UC3);for (int i = 0; i < contours.size(); i++){Scalar color = Scalar(255,255,0);drawContours(drawing, contours, i, color,1,8,hierarchy ); //对图像轮廓进行画框}imwrite("contour.jpg", drawing);

最后我们需要用for循环轮廓数量,并且调用drawContours去描绘每个图像的轮廓,轮廓的颜色是Scalar(255,255,0)青色,并保存到新的Mat矩阵里面。

完整代码:

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat img = imread("shape.png"); //读取shape图片Mat imgGray;cvtColor(img, imgGray, COLOR_RGB2GRAY); //把彩色图像转换成GRAY灰度图Mat imgCanny;Canny(imgGray, imgCanny, 25 ,75); //Canny对图像进行边缘检测,弱阈值25,强阈值75vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(imgCanny, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE); //查询轮廓,MODE是外部轮廓检测RETR_EXTERNAL,method是CHAIN_APPROX_NONE//创建空白画布为轮廓绘制提供干净的画布背景Mat drawing = Mat::zeros(imgCanny.size(), CV_8UC3);for (int i = 0; i < contours.size(); i++){Scalar color = Scalar(255,255,0);drawContours(drawing, contours, i, color,1,8,hierarchy ); //对图像轮廓进行画框}imwrite("contour.jpg", drawing);return 0;
}

最终结果:

经过上述几个步骤后,我们来看看运行的效果:图1是原图片;图2是经过轮廓提取后的图像,可以看到经过经过轮廓提取后,都可以清晰地画出每个形状的轮廓。

http://www.dtcms.com/a/573878.html

相关文章:

  • 【第1章>第3节】基于FPGA的图像腐蚀处理算法的Verilog实现
  • 西安电子科技大学信息化建设处网站模板建站排版跟没缓存好似的
  • 神经网络—— 学习与感知器(细节补充)
  • tensorflow 图像分类 之一
  • 自己网站上做淘宝搜索引擎网站开发属于什么行业
  • 查询网站备案号网站如何做免费的推广
  • 编写一个DXE driver 提供遍历pcie设备配置空间的protocol
  • 随笔之工作方法的“术”
  • 淘宝上做进出口网站有哪些我男同同性做视频网站
  • LLM中的选择性注意:从人类聚焦到模型聚焦
  • 从成本到战略:金仓 KingbaseES 的多维度优势与企业数据库选型的核心考量
  • 做pc网站排wordpress载入慢
  • Java注解在Spring Boot中的详细原理与使用情况解析
  • Python + WebSocket 实现实时体育比分系统(含数据库设计与前端演示)
  • 揭阳智能模板建站网站转应用
  • 多个网站 备案吗工作室网站建设要多大内存
  • 借助 TX Text Control:在 .NET C# 中验证 PDF/UA 文档
  • 高光谱成像系统赋能烟叶分选(烟叶除杂、烟叶霉变、烟叶烟梗区分、烟叶等级分选)
  • Java NIO 深度解析:从 BIO 到 NIO 的演进与实战​
  • 聊聊AIoT开发效率与安全:从ARMINO IDK框架说起
  • 0.5、提示词中 System、User、Assistant 的基本概念
  • 响应式网站设计建设制作温岭app开发公司
  • 门户网站用什么程序做广州手机app开发
  • 用Python和FastAPI构建一个完整的企业级AI Agent微服务脚手架
  • 青岛网站域名备案查询个人网站做哪些内容
  • Leet热题100--208. 实现 Trie (前缀树)--中等
  • 应用分析网站网站社区建设
  • 【上海海事大学主办】第六届智能电网与能源工程国际学术会议(SGEE 2025)
  • 每月网站开发费用网站改版如何做301
  • Will Al Replace Humans? From Stage to Symbiosis.