【opencv】教程代码 —ImgProc (5)提取图像中水平线和垂直线的opencv示例

3f83c1ffa3528761c8cd210dc501afdf.png

5. Morphology_3.cpp 提取图像中水平线和垂直线的opencv示例

7b9f2b913b52a95b1ac8da51d55e46fb.png

原图notes.png

87379c2b5c8899a65264dc544b2c6c26.png

灰度化

bf6c01b29efc1f41fa6c97b8194ac2e7.png

二值化

6867976d27f2aa3b196d2fa897515748.png

提取水平线

32f97ad9b41e9e0824c39f7f7ded14f4.png

提取垂直线

cbeced7931b09065a0d52e6d7c27abf9.png

对垂直图像取反

9dff0e3c3a256c75ae71ff85a01dcab2.png

提取边缘

f123a9a421faf48eef24faf9eae0d74a.png

使用膨胀操作处理边缘

eba58f261e8c7dce0b44f4189c3f7423.png

平滑处理:vertical.copyTo(smooth); blur(smooth, smooth, Size(2, 2)); smooth.copyTo(vertical, edges);

78d3ea1164d95381d58274b6170a5a06.png

5356dd4f7ad0fd9240e1fe7da7624971.png

4b57834bfd7d0bef9334ca67ac3d792f.png

2bd02467c868aaec25b57048430ade21.png

d43998ffe3ca3fa64142f53a7a9976bb.png

/*** @file Morphology_3(Extract_Lines).cpp* @brief 使用形态变换提取图片中的水平线和垂直线的示例代码* @author OpenCV team*/// 引入所需的库
#include <opencv2/core.hpp> // 查找、修改和复制矩阵
#include <opencv2/imgproc.hpp> // 图像处理
#include <opencv2/highgui.hpp> // 高级图像展示
#include <iostream> // 标准输入输出库void show_wait_destroy(const char* winname, cv::Mat img); // 创建一个函数,用于显示图像并在按键后销毁窗口// 使用标准库和OpenCV库
using namespace std;
using namespace cv;int main(int argc, char** argv)
{//! [load_image]CommandLineParser parser(argc, argv, "{@input | notes.png | 输入图片}");// 读取输入图像Mat src = imread( samples::findFile( parser.get<String>("@input") ), IMREAD_COLOR);if (src.empty()){// 若图像无法读取或无法找到,则打印出错误信息cout << "无法打开或找到图片!\n" << endl;cout << "用法: " << argv[0] << " < 输入图片 >" << endl;return -1;}// 展示原图像imshow("src", src);//! [加载图片]//! [灰度化]// 若原图像不是灰度图,将之转为灰度图Mat gray;if (src.channels() == 3){cvtColor(src, gray, COLOR_BGR2GRAY);}else{gray = src;}// 展示灰度图像show_wait_destroy("gray", gray);//! [灰度化]//! [二值化]// 在灰度图的反向图上应用自适应阈值化处理,注意此处需要用到~符号Mat bw;adaptiveThreshold(~gray, bw, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);// 展示二值化图像show_wait_destroy("binary", bw);//! [二值化]//! [初始化]// 创建两张图片,分别用于提取水平线和垂直线Mat horizontal = bw.clone();Mat vertical = bw.clone();//! [初始化]//! [提取水平线]// 指定水平轴上的大小int horizontal_size = horizontal.cols / 30;// 创建结构元素,通过形态操作来提取水平线Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontal_size, 1));// 应用形态操作erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));// 展示提取出的水平线show_wait_destroy("horizontal", horizontal);//! [提取水平线]//! [提取垂直线]// 指定垂直轴上的大小int vertical_size = vertical.rows / 30;// 创建结构元素,通过形态操作来提取垂直线Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1, vertical_size));// 应用形态操作erode(vertical, vertical, verticalStructure, Point(-1, -1));dilate(vertical, vertical, verticalStructure, Point(-1, -1));// 展示提取出的垂直线show_wait_destroy("vertical", vertical);//! [提取垂直线]//! [平滑处理]// 对垂直图像取反bitwise_not(vertical, vertical);show_wait_destroy("vertical_bit", vertical);// 根据逻辑提取边缘和平滑图像// 1. 提取边缘// 2. 使用膨胀操作处理边缘// 3. 将原图像复制至平滑图像// 4. 对平滑图像进行模糊处理// 5. 将平滑图像复制至源图像,覆盖边缘部分// 步骤1Mat edges;adaptiveThreshold(vertical, edges, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);show_wait_destroy("edges", edges);// 步骤2Mat kernel = Mat::ones(2, 2, CV_8UC1);dilate(edges, edges, kernel);show_wait_destroy("dilate", edges);// 步骤3Mat smooth;vertical.copyTo(smooth);// 步骤4blur(smooth, smooth, Size(2, 2));// 步骤5smooth.copyTo(vertical, edges);// 展示最终结果show_wait_destroy("smooth - final", vertical);//! [平滑处理]return 0;
}// 创建一个函数,用于显示图像并在按键后销毁窗口
void show_wait_destroy(const char* winname, cv::Mat img) {imshow(winname, img);moveWindow(winname, 500, 0);waitKey(0);destroyWindow(winname);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【spring】@Component注解学习

Component介绍 Component 是 Spring 框架中的一个注解&#xff0c;用于将一个类标记为 Spring 上下文中的一个组件。当一个类被标记为 Component 时&#xff0c;Spring 容器会在启动时自动扫描并实例化这个类&#xff0c;并将其注册到 Spring 上下文中。 Component 注解可以用…

通过Appium和Xcode Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

wordcloud-1.9.2(1.9.3) for python 3.6/python3.X增强补丁

wordcloud-1.9.1开始无法在python3.6和海龟编辑器内正常使用&#xff0c;特做了一个whl 提供给python3.6使用。 另外我自己使用Python3.8 &#xff0c;因此wordcloud-1.9.2-cp36-cp36-win_amd64.whl 和wordcloud-1.9.3-cp38-cp38-win_amd64.whl&#xff0c;词云图上有前20个单…

未来制造:机器人行业新质生产力提升策略

机器人行业新质生产力提升咨询方案 一、机器人行业目前发展现状及特点&#xff1a; 创新活跃、应用广泛、成长性强。 二、机器人企业发展新质生产力面临的痛点&#xff1a; 1、高端人才匮乏 2、核心技术受限 3、竞争日益国际化 4、成本控制挑战 5、用户体验提升需求 三…

浅谈电商网络爬虫技术

摘 要 目前网络上存在着海量的数据资料&#xff0c;将这些数据爬取保存下来&#xff0c;并进行进一步操作&#xff0c;即可挖掘出数据的潜在价值。如今的互联网存在的缺陷是用户很难获得有用的数据资料&#xff0c;虽然传统的搜索引擎可以为用户返回大量信息&#xff0c;但是…

react native 使用ScrollView实现下拉更新,上拉加载更多

在React Native中&#xff0c;要实现下拉更新和上拉加载更多的功能&#xff0c;你需要自定义ScrollView组件&#xff0c;监听滚动事件并根据滚动的位置来判断何时触发更新和加载更多的操作。以下是一个基本的实现思路&#xff1a; 监听滚动事件&#xff1a;使用ScrollView的on…

PyTorch----torch.nn.init.kaiming_normal_

神经网络为什么要进行权重初始化&#xff1f; 神经网络进行权重初始化的目的在于促进网络的有效训练和收敛。正确的权重初始化可以帮助缓解梯度消失或梯度爆炸等问题&#xff0c;并且有助于加速训练过程。以下是权重初始化的几个重要原因&#xff1a; 1. **避免梯度消失或梯度…

设计模式之组合模式解析

组合模式 1&#xff09;概述 1.定义 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。 组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c;组合模式又称为“整体—部分”(…

2024-03-27 问AI: 介绍一下深度学习中的 Darknet

文心一言 在深度学习中&#xff0c;Darknet是一个开源的神经网络框架&#xff0c;由Joseph Redmon开发&#xff0c;主要用于实现深度学习算法。它以其高效的实现和速度受到广泛关注&#xff0c;并在许多计算机视觉竞赛中取得了优异的结果。 Darknet的特点包括&#xff1a; 轻…

学习java第二十五天

a. IOC和DI是什么 控制反转IoC是一种设计思想&#xff0c;而依赖注入DI(Dependency Injection)是IOC的一种实现方法。一般来说&#xff0c;对象的创建源自程序本身&#xff0c;而IoC反转了这种模式&#xff0c;将创建对象的控制转移给了第三方&#xff08;用户&#xff09;。这…

SpringBoot整合Redis:缓存击穿--互斥锁解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

数字时代的风向标:Facebook如何引领社交媒体的发展方向

引言 在当今数字时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为其中的领军者&#xff0c;不仅影响着亿万用户的生活&#xff0c;也在塑造着整个社交媒体行业的发展方向。本文将深入探讨Facebook在数字时代的地位、影响力以及对社交媒…

3d放上模型为什么渲染不出来---模大狮模型网

如果在3D软件中放置模型后无法正确渲染出来&#xff0c;可能有几个常见的原因导致这种情况发生&#xff1a; 材质设置问题&#xff1a;确保所放置的模型具有正确的材质和纹理&#xff0c;并且材质设置正确。如果材质设置有误&#xff0c;可能会导致模型无法正确显示。 光照设置…

flink: 从pulsar中读取数据

一、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

配置小程序的服务器域名

准备工作 拥有一个已注册的域名&#xff1a;确保您已经注册了一个符合国家和地区相关法律法规要求的域名。 完成域名备案&#xff08;如有必要&#xff09;&#xff1a;根据国家和地区的法律法规&#xff0c;某些情况下可能需要对域名进行备案才能用于互联网服务。 配置 DNS&…

Vue 二次封装组件的艺术与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

备考ICA----Istio实验9---熔断Circuit Breaking 实验

备考ICA----Istio实验9—熔断Circuit Breaking 实验 1. 环境准备 创建httpbin环境 kubectl apply -f istio/samples/httpbin/httpbin.yaml kubectl get svc httpbin2. 创建测试用客户端 kubectl apply -f istio/samples/httpbin/sample-client/fortio-deploy.yaml3. 创建Ht…

python笔记进阶--模块、文件及IO操作(1)

目录 一&#xff0e;模块 1.模块的导入和使用 1.1导入整个模块 1.2导入函数 1.3使用as给模块指定别名 2.常见标准库 2.1 import random&#xff1a; 2.2 import math&#xff1a; 2.3正则表达式处理 2.4turtle 二&#xff0e;文件及IO操作 1.文件 1.1绝对路径与相…

Intellij IDEA 类注释模板设置

1、配置全局USER 在此配置全局USER&#xff0c;用于填充自动生成的注释中的作者author属性。 注释模板中的user参数是默认是获取系统的用户&#xff08;当然注释作者也可以直接写固定值&#xff09;&#xff0c;如果不想和系统用户用同一个信息&#xff0c;可以在IDEA中进行配…

【自我提升】一、Hyperledger Fabric 概念梳理

写在前面&#xff1a;最近因为业务需要&#xff0c;开始学习Hyperledger Fabric了&#xff0c;做java全栈工程师可真难搞。现在算是啥类型的都在涉及了&#xff0c;现在这个技术啥都不懂&#xff0c;就先开个学习专栏&#xff0c;记录记录。顺带也给各位道友参考参考。 目录 …