OpenCV学习笔记

一、OpenCV基础

(一)图像的读取、显示、创建

https://mp.weixin.qq.com/s?__biz=MzA4MTA1NjM5NQ==&mid=2247485202&idx=1&sn=05d0b4cd25675a99357910a5f2694508&chksm=9f9b80f6a8ec09e03ab2bb518ea6aad83db007c9cdd602c7459ed75c737e380ac9c34bc0d614&scene=178&cur_album_id=2073041855356764164#rd

(二)图像的属性以及像素相关的操作

https://mp.weixin.qq.com/s?__biz=MzA4MTA1NjM5NQ==&mid=2247485234&idx=1&sn=64c4a7235bd02a49d844089a84e6a01d&chksm=9f9b80d6a8ec09c029a387bbdeea3f8f7ecbc31e9032da047b6e77cf0394f272ada897c10f3b&scene=178&cur_album_id=2073041855356764164#rd

data:表示 Mat 对象中的指针(uchar 类型的指针),指向内存中存放矩阵数据的一块内存 (uchar* data)。
step: 字面意思是“步长”,实际上它描述了矩阵的形状。 step[] 为一个数组,矩阵有几维,step[] 数组就有几个元素。以一个三维矩阵为例,step[0] 表示一个平面的字节总数,step[1] 表示一行元素的字节总数,step[2] 表示每一个元素的字节总数。
上面两个数据可以配合使用来获得Mat中任意位置的数据
在这里插入图片描述

(三)threshold函数的使用

https://blog.csdn.net/u012566751/article/details/77046445

图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。OpenCV中提供了函数cv::threshold();

(四)形态学之提取连通域

https://mp.weixin.qq.com/s?__biz=Mzg3NjY3NjI0Mw==&mid=2247484975&idx=1&sn=5ea64c7c4dd3c017eac0551f12c45137&chksm=cf2fd3d3f8585ac5b6e59f313a42d8981b8d09721f88eea7ee4a71ecfae7baeacf69fb0e1ec2&mpshare=1&scene=1&srcid=1030Tal3VDLygpiUNPLo45zv&sharer_shareinfo=84ef8c16db4fd26fa08ad0259bcc4dce&sharer_shareinfo_first=84ef8c16db4fd26fa08ad0259bcc4dce#rd

1.连通域概念:指图像中具有相同像素值且位置相邻的像素组成的区域。
2.相关函数:

int connectedComponents(InputArray image, OutputArray labels, int connectivity = 8, int ltype = CV_32S);

image:输入图像,待标记8位单通道图像。
labels:输出图像,目标标记图像。
connectivity:连通域大小,四连通域还是八连通域。
输出类型:CV32S 和 CV_16U ,默认是 CV_32S 。
返回连通域个数。

例子:

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

int main()
{
 cv::Mat input = cv::imread("src/rice.jpg");
 cv::Mat img_bw, connectimg;
 cv::cvtColor(input, img_bw, cv::COLOR_BGR2GRAY);
 cv::threshold(img_bw, img_bw, 100, 255, cv::THRESH_BINARY_INV);

 // 做一些膨胀和腐蚀使得图像连通域明显
 cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
 cv::erode(img_bw, img_bw, element, cv::Point(-1, -1), 2);
 cv::dilate(img_bw, img_bw, element, cv::Point(-1, -1), 2);

 int num = cv::connectedComponents(img_bw, connectimg, 8, CV_16U);
 std::cout << "连通域个数:" << num << std::endl;

 cv::namedWindow("原图", cv::WINDOW_NORMAL);
 cv::imshow("原图", img_bw);

 //以不同颜色标记出不同的连通域
 cv::Mat result = cv::Mat::zeros(img_bw.size(), CV_8UC3); //定义标记结果图像
 //定义五种颜色
 std::vector<cv::Vec3b> color;
 color.push_back(cv::Vec3b(0, 0, 255));
 color.push_back(cv::Vec3b(0, 255, 0));
 color.push_back(cv::Vec3b(255, 0, 0));
 color.push_back(cv::Vec3b(0, 255, 255));
 color.push_back(cv::Vec3b(255, 255, 0));

 for (int i = 0; i < result.cols; i ++)
 {
  for (int j = 0; j < result.rows; j ++)
  {
   int label = connectimg.at<uint16_t>(i, j);
   if (label == 0)
   {
    continue; //背景的黑色不改变
   }
   result.at<cv::Vec3b>(i, j) = color[label % 5];
  }
 }

 cv::namedWindow("标记连通域后", cv::WINDOW_NORMAL);
 cv::imshow("标记连通域后", result);

 cv::waitKey(0);
 return 0;
}

原始图片和更改颜色后的连通域:
在这里插入图片描述

(五)距离变换distanceTransform应用——查找物体质心&&细化字符轮廓

https://www.cnblogs.com/mtcnn/p/9411967.html

distanceTransform方法的功能:
用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远

1、查找物体质心

C++

#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"

using namespace cv;

int main(int argc,char *argv[])
{
	float maxValue=0;  //定义距离变换矩阵中的最大值
	Point Pt(0,0);
	Mat image=imread(argv[1]);
	Mat imageGray;
	cvtColor(image,imageGray,CV_RGB2GRAY);
	imageGray=~imageGray;  //取反
	GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波
	threshold(imageGray,imageGray,20,200,CV_THRESH_BINARY); //阈值化	
	Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵
	distanceTransform(imageGray,imageThin,CV_DIST_L2,3);  //距离变换
	Mat distShow;
	distShow=Mat::zeros(imageGray.size(),CV_8UC1); //定义细化后的字符轮廓
	for(int i=0;i<imageThin.rows;i++)
	{
		for(int j=0;j<imageThin.cols;j++)
		{
			distShow.at<uchar>(i,j)=imageThin.at<float>(i,j);
			if(imageThin.at<float>(i,j)>maxValue)
			{
				maxValue=imageThin.at<float>(i,j);  //获取距离变换的极大值
				Pt=Point(j,i);  //坐标
			}
		}
	}
	normalize(distShow,distShow,0,255,CV_MINMAX); //为了显示清晰,做了0~255归一化
	circle(image,Pt,maxValue,Scalar(0,0,255),3);	
	circle(image,Pt,3,Scalar(0,255,0),3);
	imshow("Source Image",image);
	imshow("Thin Image",distShow);
	waitKey();
	return 0;
}

1).原始图片:
在这里插入图片描述
2).经过距离变换后距离Mat矩阵dst:
为了显示清晰,做了0~255的归一化。可以看到,中心处最亮,说明了中心点距离零点的距离最远,而最远处就可以作为物体的质心。
在这里插入图片描述
3).标记质心(绿色点):
在这里插入图片描述

2、细化轮廓

C++:

#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"

using namespace cv;

int main(int argc,char *argv[])
{
	float maxValue=0;  //定义距离变换矩阵中的最大值
	Mat image=imread(argv[1]);
	Mat imageGray;
	cvtColor(image,imageGray,CV_RGB2GRAY);
	imageGray=~imageGray;  //取反
	GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波
	threshold(imageGray,imageGray,20,200,CV_THRESH_BINARY); //阈值
	imshow("s",imageGray);
	Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵
	distanceTransform(imageGray,imageThin,CV_DIST_L2,3);  //距离变换
	Mat distShow;
	distShow=Mat::zeros(imageGray.size(),CV_8UC1); //定义细化后的字符轮廓
	for(int i=0;i<imageThin.rows;i++)
	{
		for(int j=0;j<imageThin.cols;j++)
		{
			if(imageThin.at<float>(i,j)>maxValue)
			{
				maxValue=imageThin.at<float>(i,j);  //获取距离变换的极大值
			}
		}
	}
	for(int i=0;i<imageThin.rows;i++)
	{
		for(int j=0;j<imageThin.cols;j++)
		{
			if(imageThin.at<float>(i,j)>maxValue/1.9)
			{
				distShow.at<uchar>(i,j)=255;   //符合距离大于最大值一定比例条件的点设为255
			}
		}
	}
	imshow("Source Image",image);
	imshow("Thin Image",distShow);
	waitKey();
	return 0;
}

1.原始图像:
在这里插入图片描述
2.细化效果:
在这里插入图片描述

二、 形态学操作之腐蚀与膨胀

https://blog.csdn.net/qq_42856191/article/details/123663533

(一)腐蚀(erosion)

1.1 什么是腐蚀
简单来说,腐蚀就是把图像中的物体变小了!(用背景去侵蚀前景)

腐蚀的工作过程如下图所示,A是一个集合,B是一个结构单元,我们使用B去对集合A进行腐蚀,腐蚀过程如C所示,在腐蚀过程中,结构单元必须全部位于集合A中才能进行腐蚀操作,最终得到的结果即为D所示。
在这里插入图片描述
Python:

import cv2
import numpy as np


ori = cv2.imread(r"C:\Users\Lenovo\Desktop\original.jpg")   # 读取图像

kernel1 = np.ones((3, 3), np.uint8)     # 3个不同尺度的腐蚀单元
kernel2 = np.ones((5, 5), np.uint8)
kernel3 = np.ones((7, 7), np.uint8)

erosion1 = cv2.erode(ori, kernel1)		# 腐蚀函数
erosion2 = cv2.erode(ori, kernel2)
erosion3 = cv2.erode(ori, kernel3)

cv2.imshow("original", ori)
cv2.imshow("erosion1", erosion1)
cv2.imshow("erosion2", erosion2)
cv2.imshow("erosion3", erosion3)

cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion1.jpg', erosion1)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion2.jpg', erosion2)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion3.jpg', erosion3)

cv2.waitKey()

下面展示的是程序得到的结果图,由图可知,腐蚀能对图像中的毛刺进行去除,但这也与腐蚀单元的大小有关,3 × 3 3×33×3大小的核去除效果不如5 × 5 5×55×5与7 × 7 7×77×7,此外7 × 7 7×77×7的核使得图像变得更加细小。
在这里插入图片描述

(二)膨胀(dilation)

2.1 什么是膨胀
简单来说,膨胀就是把图像中的物体变大了!(对前景进行膨胀)

膨胀的工作过程如下图所示,A是一个集合,B是一个结构单元,我们使用B去对集合A进行膨胀,膨胀过程如C所示,在膨胀过程中,结构单元只要有一个位于集合A中就能进行膨胀操作,最终得到的结果即为D所示。
在这里插入图片描述
Python:

import cv2
import numpy as np


ori = cv2.imread(r"C:\Users\Lenovo\Desktop\original.jpg")   # 读取图像

kernel1 = np.ones((3, 3), np.uint8)     # 3个不同尺度的腐蚀单元
kernel2 = np.ones((5, 5), np.uint8)
kernel3 = np.ones((9, 9), np.uint8)

dilation1 = cv2.dilate(ori, kernel1)    # 膨胀函数
dilation2 = cv2.dilate(ori, kernel2)
dilation3 = cv2.dilate(ori, kernel3)

cv2.imshow("original", ori)
cv2.imshow("dilation1", dilation1)
cv2.imshow("dilation2", dilation2)
cv2.imshow("dilation3", dilation3)

cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation1.jpg', dilation1)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation2.jpg', dilation2)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation3.jpg', dilation3)

cv2.waitKey()

下面展示的是程序得到的结果图,由图可知,膨胀能对图像中的物体进行扩张,但这也与膨胀单元的大小有关,越大的膨胀核使得图像扩张区域更大。
在这里插入图片描述

三、形态学操作之开运算与闭运算

https://blog.csdn.net/qq_42856191/article/details/123670455

(一)开运算

1.1 什么是开运算:先腐蚀后膨胀的操作称为开运算。
1.2作用:消除细小物体、在窄区域分离物体、平滑大物体边界等。
在这里插入图片描述

(二)闭运算

2.1 什么是闭运算:先膨胀后腐蚀的操作称为闭运算。
2.2作用:填充物体空洞、消除噪声、连接邻近物体、平滑边界等。
在这里插入图片描述

四、图像分割 – 距离变换与分水岭算法(硬币检测、扑克牌检测、车道检测)

https://blog.csdn.net/great_yzl/article/details/119831771

以上述引用中的硬币检测为例子的分割过程:
1.将RGB图片转换为灰度图
2.去噪
开运算:先侵蚀后膨胀。会将两个物体之间可能存在的粘连噪点过滤,并将前景物体扩大。
3.确定背景区域
对图片进行膨胀操作,将前景扩大,背景也会随之减小。那么此时对象>原对象,此时背景 < 原背景,那么此时的背景自然可以确定为原背景的一部分。(离对象中心很远的是背景)
4.确定前景区域
原理:距离变换,在二值图中把对象缩小,得到的就是原图的一部分,可以确定为前景。
这种距离变换可以将前景中的不同实例分离,距离变换后得到前景物体不同灰度值的像素,通过threshold函数选定一个阈值来缩小前景物体中每个的大小,从而达到将不同实例分离的效果。(不分离的话,可以不用距离变换,只用腐蚀就够了)
下图分别为img原始图片、opening膨胀后的图片、sure_fg距离变换后经过threshold阈值操作获得的确定前景实例
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KT6368A蓝牙芯片的4脚也就是蓝牙天线脚对地短路了呢?是不是坏了

一、问题简介 KT6368A芯片的4脚&#xff0c;也就是蓝牙天线脚&#xff0c;万用表测量对地短路了呢&#xff1f;是不是芯片坏掉了&#xff0c;能不能重新寄样品给我。 详细说明 首先&#xff0c;芯片没有坏&#xff0c;遇到自己不懂的地方&#xff0c;不要轻易的去怀疑。 而是…

前后端分离项目(六):数据分页查询(前端视图)

&#x1f680; 优质资源分享 &#x1f680; &#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一个全栈订餐系统。 &#x1f49b;Python量化交易实战&#x1f49…

企业内部外网向内网传输文件如何实现高效安全?

随着信息技术的发展&#xff0c;企业内部外网隔离已成为一种常见的网络安全措施&#xff0c;旨在防止外部攻击者入侵内部网络&#xff0c;保护企业的核心数据和业务系统。然而&#xff0c;企业内外网隔离也带来了一些问题&#xff0c;其中之一就是如何实现内外网之间的文件传输…

如何在实践中建立持久有效的6S管理呢?

提起6S管理&#xff0c;很多人可能认为是老旧的概念。然而&#xff0c;在三一集团&#xff0c;整理、整顿、清扫、清洁、素养和安全这12个字被执行到极致&#xff0c;甚至形成了一个共识&#xff1a;“搞不好6S的总经理是不合格的总经理”。这是因为三一集团高层通过多年的实践…

ROS常用命令及多机(TX2 与虚拟机)通信步骤

目录 ROS常用命令 常用命令 ROS多机通信步骤 虚拟机中添加镜像源 TX2中添加镜像源 ROS常用命令 rostopic list 命令查看当前系统中有哪些 topic。 rostopic info 命令查看该 topic 的信息&#xff0c;包括它的数据类型、发布者数量等。 rostopic hz 命令查看该 topic 的发布…

Mybatis @MapKey注解返回指定Map源码解析与用例

文章目录 前言技术积累什么是MyBatisMapKey注解 用例展示MapKey注解源码解析写在最后 前言 最近在开发的一个业务功能需要从一批数据中根据业务字段提取数据&#xff0c;对于这个需求可能有的同学就直接用for或者stream循环的方式进行处理了。但是&#xff0c;作为一个资深的搬…

场景交易额超40亿,海尔智家三翼鸟开始收获

文 | 螳螂观察 作者 | 余一 随着双十一的到来&#xff0c;国内的消费情绪再次被点燃。在这类大促之下&#xff0c;品牌们就像一个个天体&#xff0c;不断引动着市场潮汐&#xff0c;期待自己能触发更大的“海潮效应”。 所谓“海潮效应”是指&#xff0c;海水因天体的引力而…

Linux的基础常用指令

常用指令汇及其功能 ls 列出当前文件夹有哪些文件 ls -a显示所有文件&#xff0c;包含隐藏的文件和文件夹pwd显示当前是在哪个文件夹下mkdirmkdir名字→创建文件夹cdcd名字→进入某个指定文件夹cd .. 退回上层文件夹(cd后有空格) Tab键自动补全&#xff1a;文件或文件名太长&a…

【原创】java+swing+mysql志愿者管理系统设计与实现

摘要&#xff1a; 志愿者管理系统是一个用于管理志愿者以及活动报名的系统&#xff0c;提高志愿者管理的效率&#xff0c;同时为志愿者提供更好的服务和体验。本文主要介绍如何使用javaswingmysql去实现一个志愿者管理系统。 功能分析&#xff1a; 系统主要提供给管理员和志…

CSS中的栅格布局

CSS中的栅格布局 在写前端项目的时候&#xff0c;我之前一直习惯使用flex布局&#xff0c;flex布局写起来比较随心&#xff0c;几乎可以实现任意形式的页面布局。不过自从B占看到某位大佬的grid布局后&#xff0c;发现布局居然还可以这么玩&#xff0c;正好自己在写一个vue3的…

github搜索技巧探索

毕设涉及到推荐系统&#xff0c;那么就用搜索推荐系统相关资料来探索一下GitHub的搜搜技巧 文章目录 1. 基础搜索2. 限定在特定仓库搜索3. 按照语言搜索4. 按照star数量搜索5. 搜索特定用户/组织的仓库6. 查找特定文件或路径7. 按时间搜索8. 搜索不包含某个词的仓库9. 搜索特定…

pytorch 入门 (五)案例三:乳腺癌识别-VGG16实现

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】乳腺癌识别&#x1f356; 原作者&#xff1a;K同学啊 在本案例中&#xff0c;我将带大家探索一下深…

用大白话聊聊SpringBoot的自动配置原理(面试题详解)

首先&#xff0c;SpringBoot的自动配置不等于自动装配&#xff01; 自动配置是Auto-Configuration&#xff0c;针对的是SpringBoot中的配置类&#xff0c; 而自动装配是Autowire&#xff0c;针对的是Spring中的依赖注入。 进入主题&#xff1a; 自动配置简单来说就是自动去把…

Cesium 问题:在 cesium 中加载 geojson 文件,绘制带边框的多边形并设置贴地后,边框不展示,该怎么配置呢?

文章目录 问题分析问题 在 cesium 中加载 geojson 文件,绘制带边框的多边形并设置贴地后,边框不展示,该怎么配置呢? 代码如下: var promise = Cesium.GeoJsonDataSource.load(data/obstacle/ExOceanData/result.geojson

自动化测试的一些问题合集

问题1、 ipykernel_launcher.py: error: unrecognized arguments: usage: ipykernel_launcher.py [-h] [--id ID] [--test TEST] [--env ENV] ipykernel_launcher.py: error: unrecognized arguments: --ip127.0.0.1 --stdin9003 --control9001 --hb9000 --Session.signature_…

SAML- 安全断言标记语言

一、概念 安全断言标记语言&#xff08;SAML&#xff09;是一种开放标准&#xff0c;用于在各方之间&#xff08;特别是身份提供商和服务提供商之间&#xff09;交换身份验证和授权数据。SAML 是一种基于XML的安全断言标记语言&#xff08;服务提供商用来做出访问控制决策的语句…

python使用ffmpeg来制作音频格式转换工具(优化版)

简介:一个使用python加上ffmpeg模块来进行音频格式转换的工具。 日志: 20231030:第一版,设置了简单的UI布局和配色,实现音频转为Mp3、AAC、wav、flac四种格式。可解析音频并显示信息,可设置转换后的保存路径 UI界面: 编程平台:visual studio code 编程语言:python 3…

基于 Center 的 3D 目标检测和跟踪

论文地址&#xff1a;https://arxiv.org/abs/2006.11275 论文代码&#xff1a;https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段&#xff0c;使用关键点检测器检测对象的中心&#xff0c;然后回归到其他属性&#xff0…

AcWing 第127场周赛 构造矩阵

构造题目&#xff0c;考虑去除掉最后一行最后一列先进行考虑&#xff0c;假设除了最后一行和最后一列都已经排好了&#xff08;你可以随便排&#xff09;&#xff0c;那么分析知最后一个数字由限制以外其他都已经确定了&#xff0c;无解的情况是k为-1 并且n&#xff0c;m的奇偶…

C++进阶语法——STL 标准模板库(上)(Standard Template Library)【学习笔记(六)】

文章目录 STL 标准模板库1、 STL简介2、STL容器的类别3、STL迭代器的类别4、STL算法的类别5、泛型编程&#xff08;generic programming&#xff09;6、C模板&#xff08;template&#xff09;6.1 函数模板&#xff08;function template&#xff09;6.2 类模板&#xff08;cla…