C++ opencv基本用法【学习笔记(九)】

这篇博客为修改过后的转载,因为没有转载链接,所以选了原创

文章目录

    • 一、vs code 结合Cmake debug
      • 1.1 配置tasks.json
      • 1.2 配置launch.json
    • 二、图片、视频、摄像头读取显示
      • 2.1 读取图片并显示
      • 2.2 读取视频文件并显示
      • 2.3 读取摄像头并写入文件
    • 三、图片基本操作
      • 3.1 颜色转换
      • 3.2 图像filtering
      • 3.3 形状调整
      • 3.4 绘制
    • 四、RTSP 视频流
      • 4.1 本机构造RTSP视频流(optional)
      • 4.2 使用ffmpeg作为视频解码
    • 五、人脸检测小例子

一、vs code 结合Cmake debug

1.1 配置tasks.json

文件架构如下:
在这里插入图片描述
需要注意"-DCMAKE_BUILD_TYPE=Debug" 要设置为Debug模式。

{
	"version": "2.0.0",
	"tasks": [
		{
			// cmake配置
			"type": "cppbuild",
			"label": "CMake配置",
			"command": "cmake", // cmake命令
			"args": [
				"-S .", // 源码目录
				"-B build", // 编译目录
				"-DCMAKE_BUILD_TYPE=Debug" // 编译类型
			],
			"options": {
				"cwd": "${workspaceFolder}" // 工作目录
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
		},
		{
			// cmake编译
			"type": "cppbuild",
			"label": "CMake编译",
			"command": "cmake", // cmake命令
			"args": [
				"--build", // 编译
				"build", // 编译目录
			],
			"options": {
				"cwd": "${workspaceFolder}" // 工作目录
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
			"dependsOn": [
				"CMake配置" // 依赖CMake配置,先执行CMake配置
			]
		},
		{
			// 删除build目录
			"type": "shell",
			"label": "删除build目录",
			"command": "rm -rf build",
			"options": {
				"cwd": "${workspaceFolder}" // 工作目录
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
			
			
		}
	]
}

1.2 配置launch.json

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "CMake调试",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/cmake_debug", // 编译后的程序,需要结合CMakeLists.txt中的add_executable()函数
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "CMake编译"
        }
    ]
}

二、图片、视频、摄像头读取显示

2.1 读取图片并显示

// 使用imread函数读取图片,和Python用法类似
// 读取的数据保存在Mat类型的变量image中,Mat是opencv中的图像数据结构,类似numpy中的ndarray
cv::Mat image = cv::imread("图片路径");

// 输出数据,以numpy和Python list格式输出
std::cout << cv::format(image, cv::Formatter::FMT_NUMPY) << std::endl;
std::cout << cv::format(image, cv::Formatter::FMT_PYTHON) << std::endl;

// 判断图像是否读取成功,返回true表示失败
if (image.empty())
{
  std::cout << "无法读取图片"  << std::endl;
  return 1;
} 
// imshow显示图像
cv::imshow("opencv demo", image);
// 保存图像
cv::imwrite("./output/gray_image.jpg", gray_image);

// 等待按键
cv::waitKey(0); 

2.2 读取视频文件并显示

// 读取视频:创建了一个VideoCapture对象,参数为视频路径
cv::VideoCapture capture("视频路径");

// 判断视频是否读取成功,返回true表示成功
if (!capture.isOpened())
{
  std::cout << "无法读取视频"  << std::endl;
  return 1;
}

// 读取视频帧,使用Mat类型的frame存储返回的帧
cv::Mat frame;
// 循环读取视频帧
while (true)
{
  // 读取视频帧,使用 >> 运算符或者read()函数,他的参数是返回的帧
  capture.read(frame);
  // capture >> frame;
  
  // 显示视频帧
  cv::imshow("opencv demo", frame);
}

2.3 读取摄像头并写入文件

// 读取视频:创建了一个VideoCapture对象,参数为摄像头编号
cv::VideoCapture capture(0);

// 写入MP4文件,参数分别是:文件名,编码格式,帧率,帧大小  
cv::VideoWriter writer("record.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 20, cv::Size(640, 480));

// 写入视频
writer.write(frame);

三、图片基本操作

3.1 颜色转换

// BGR -> Gray
// 三个参数分别是输入图像、输出图像、转换方式
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
// BGR -> HSV,Hue(色调)、Saturation(饱和度)、Value(明度)
cv::cvtColor(src, hsv, cv::COLOR_BGR2HSV);
// BGR -> RGB
cv::cvtColor(src, rgb, cv::COLOR_BGR2RGB);

3.2 图像filtering

// 三个参数分别是输入图像、输出图像、卷积核大小
cv::GaussianBlur(src, blur, cv::Size(7, 7), 0);
// 膨胀
// 三个参数分别是输入图像、输出图像、卷积核大小
cv::dilate(src, dilate, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)));
// 腐蚀
// 三个参数分别是输入图像、输出图像、卷积核大小
cv::erode(src, erode, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)));

3.3 形状调整

// ======== resize ========
// 三个参数分别是输入图像、输出图像、输出图像大小
cv::resize(src, resize, cv::Size(320, 240));

// ======== copy ========
cv::Mat copy;
src.copyTo(copy);
// ======== ROI裁剪 ========
cv::Rect rect(100, 100, 200, 100); // x, y, width, height
cv::Mat roi = src(rect);
cv::imwrite("./output/3.roi.jpg", roi);

// ======== 拼接 ========
cv::Mat dog_img = cv::imread("./media/dog.jpg");
cv::Mat dog_resize;
cv::resize(dog_img, dog_resize, cv::Size(320, 240));

// 水平拼接,需要保证两张图片的高度(rows)一致
cv::Mat hconcat_img;
cv::hconcat(resize, dog_resize, hconcat_img);
cv::imwrite("./output/3.hconcat.jpg", hconcat_img);

// 或者使用vector方式
std::vector<cv::Mat> imgs{resize, dog_resize, resize, dog_resize};
cv::Mat hconcat_img2;
cv::hconcat(imgs, hconcat_img2);
cv::imwrite("./output/3.hconcat2.jpg", hconcat_img2);

// 数组方式
cv::Mat imgs_arr[] = {dog_resize, resize, dog_resize, resize};
cv::Mat hconcat_img3;
cv::hconcat(imgs_arr, 4, hconcat_img3); // 4是数组长度
cv::imwrite("./output/3.hconcat3.jpg", hconcat_img3);

// 垂直拼接,需要保证两张图片的宽度(cols)一致
cv::Mat vconcat_img;
cv::vconcat(resize, dog_resize, vconcat_img);
cv::imwrite("./output/3.vconcat.jpg", vconcat_img);

// ======== 翻转 ========
cv::Mat flip;
// 三个参数分别是输入图像、输出图像、翻转方向
cv::flip(src, flip, 1); // 1表示水平翻转,0表示垂直翻转,-1表示水平垂直翻转

// ======== 旋转 ========
cv::Mat rotate;
// 三个参数分别是输入图像、输出图像、旋转角度
cv::rotate(src, rotate, cv::ROTATE_90_CLOCKWISE); // 顺时针旋转90度

3.4 绘制

// 创建一个黑色图像,参数分别是图像大小、图像类型,CV_8UC3表示8位无符号整数,3通道
cv::Mat image = cv::Mat::zeros(cv::Size(600, 600), CV_8UC3);

// 绘制直线,参数分别是图像、起点、终点、颜色、线宽、线型
cv::line(image, cv::Point(50, 50), cv::Point(350, 250), cv::Scalar(0, 0, 255), 2, cv::LINE_AA);
// 绘制矩形,参数分别是图像、左上角、右下角、颜色、线宽、线型
cv::rectangle(image, cv::Point(50, 50), cv::Point(350, 250), cv::Scalar(0, 255, 0), 2, cv::LINE_AA);
// 绘制圆形,参数分别是图像、圆心、半径、颜色、线宽、线型
cv::circle(image, cv::Point(200, 150), 100, cv::Scalar(255, 0, 0), 2, cv::LINE_AA);
// 实心
cv::circle(image, cv::Point(200, 150), 50, cv::Scalar(255, 0, 0), -1, cv::LINE_AA);

// ================== 多边形 ==================
cv::Point points[2][4]; // 定义两个多边形的顶点数组
// 第一个多边形的顶点
points[0][0] = cv::Point(100, 115);
points[0][1] = cv::Point(255, 135);
points[0][2] = cv::Point(140, 365);
points[0][3] = cv::Point(100, 300);
// 第二个多边形的顶点
points[1][0] = cv::Point(300, 315);
points[1][1] = cv::Point(555, 335);
points[1][2] = cv::Point(340, 565);
points[1][3] = cv::Point(300, 500);
// ppt[] 要同时添加两个多边形顶点数组的地址)
const cv::Point *pts_v[] = {points[0], points[1]};
// npts_v[]要定义每个多边形的定点数
int npts_v[] = {4, 4};
// 绘制多边形,参数分别是图像、顶点数组、顶点数、是否闭合、颜色、线宽、线型
cv::polylines(image, pts_v, npts_v, 2, true, cv::Scalar(255, 0, 255), 2, 8, 0);

// ================== 使用vector绘制多边形 ==================
std::vector<cv::Point> points_v;
// 随机生成5个点
for (int i = 0; i < 5; i++)
{
  points_v.push_back(cv::Point(rand() % 600, rand() % 600));
}
// 绘制多边形,参数分别是图像、顶点数组、是否闭合、颜色、线宽、线型
cv::polylines(image, points_v, true, cv::Scalar(255, 0, 0), 2, 8, 0);


// ================== 绘制文字 ==================
// 参数分别是图像、文字、文字位置、字体、字体大小、颜色、线宽、线型
cv::putText(image, "Hello World!", cv::Point(400, 50), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255, 255, 255), 2, 8, 0);

四、RTSP 视频流

4.1 本机构造RTSP视频流(optional)

# Ubuntu安装ffmpeg
sudo apt-get install ffmpeg

# 赋予权限
chmod +x rtsp-simple-server
chmod +x start_server.sh
# 运行服务
./start_server.sh

# 退出服务
pkill rtsp-simple-server
pkill ffmpeg

4.2 使用ffmpeg作为视频解码

// CAP_FFMPEG:opencv 使用ffmpeg解码
cv::VideoCapture stream1 = cv::VideoCapture("rtsp地址", cv::CAP_FFMPEG);

五、人脸检测小例子

附件位置:5.face_detection

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

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

相关文章

现货黄金职业交易员怎么使用技术分析?

职业的交易员每天要处理很多不同的信息&#xff0c;其中只一部分是涉及技术指标。在这一部分处理技术分析的时间里&#xff0c;只能再分出少之又少的时间给技术指标。那职业交易员会利用做技术指标做什么呢&#xff1f;下面我们就来讨论一下。 识别行情。技术指标的主要作用就是…

TikTok女性创作者:媒体世界的新领袖

在数字时代&#xff0c;社交媒体已成为媒体和娱乐产业的关键组成部分&#xff0c;而TikTok作为最受欢迎的短视频分享平台之一&#xff0c;为女性创作者提供了一个独特的机会来在媒体世界中崭露头角。 这个平台不仅为女性创作者提供了一个创作和分享自己的声音、观点和创意的空…

(三)什么是Vite——Vite 主体流程(运行npm run dev后发生了什么?)

什么是vite系列目录: &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff08;冷启动&#xff09;-CSDN博客 &#xff08;三&#xff09;什么是Vite——Vite 主体流程(运行npm run dev…

江西产业链现代化1269行动计划引领新能源建设与职业教育教学改革的深度融合

江西产业链现代化1269行动计划引领新能源建设与职业教育教学改革的深度融合 在全球能源转型的时代背景下&#xff0c;江西省积极应对挑战&#xff0c;提出了产业链现代化1269行动计划。这一计划不仅着眼于推动新能源建设&#xff0c;还将新能源建设与职业教育教学改革紧密结合…

Axure9 基本操作(二)

1. 文本框、文本域 文本框&#xff1a;快速实现提示文字与不同类型文字显示的效果。 2. 下拉列表、列表框 下拉列表&#xff1a;快速实现下拉框及默认显示项的效果。 3. 复选框、单选按钮 4.

零成本体验美国云服务器,更方便的体验和选择

在当今数字化时代&#xff0c;云计算已经成为了企业和个人的首选。而美国云服务器免费试用&#xff0c;则为广大用户提供了一个零风险尝试的机会。作为一种高效、灵活、稳定的解决方案&#xff0c;美国云服务器可以为您的业务保驾护航。 什么是美国云服务器&#xff1f; 美国云…

掌握AI图像篡改检测工具,轻松识别图片造假

文章目录 一、前言1.1 背景与危害1.2会议探讨1.3 技术先行 二、亮点技术1&#xff1a;AI图像篡改检测技术2.1 传统方法Python实现步骤2.2 合合信息——PS纂改检测体验 三、亮点技术2&#xff1a;生成式图像鉴别3.1 生成式图像安全问题3.2 传统方法Python实现步骤3.2 合合信息—…

《Linux从练气到飞升》No.27 Linux中的线程互斥

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

小DEMO:在vue中自定义range组件

1、组件样式 2、使用 import cSlider from /components/c-slider/c-slider.vue<div class"range"><cSlider v-model"cScale" change"cScaleChange" :min"1" :max"10"/> </div> 3、组件代码 <templa…

5+单基因+免疫浸润,这篇肿瘤预后文章你值得拥有

今天给同学们分享一篇生信文章“Systematic analysis of the role of SLC52A2 in multiple human cancers”&#xff0c;这篇文章发表在Cancer Cell Int期刊上&#xff0c;影响因子为5.8。 结果解读&#xff1a; 多种人类癌症中SLC52A2的mRNA表达 首先&#xff0c;作者使用GT…

virtualbox基本配置

全屏模式调出热键 右边的 ctrl home 键 安装增强功能 注意&#xff1a;virtualbox 自带那个安装增强功能点击后是没有效果的 1、启动虚拟机 2、设备 3、分配虚拟光驱 4、选择虚拟盘 5、选择对应iso文件&#xff0c;文件下载路径 6、双击对应文件安装&#xff0c;默认配置…

多区域OSPF配置

配置命令步骤&#xff1a; 1.使用router ospf 进程ID编号 启用OSPF路由 2.使用network 直连网络地址 反掩码 area 区域号 将其归于对应区域 注意&#xff1a; 1.进程ID编号可任意&#xff08;1-65535&#xff09; 2.反掩码用4个255相减得到 3.area 0 为主干区域 4.连接不…

虚拟机第一次如何打开

1、将别人的虚拟机拷贝到自己的电脑盘里&#xff1b; 2、打开VMware&#xff0c;选择“打开虚拟机”&#xff1b; 3、选择拷贝的虚拟机里的.vmx文件&#xff1b; 4、选择“播放虚拟机”&#xff1b; 5、如果出现一个选择框&#xff0c;选“我已复制改虚拟机”即可。

Python 中的 tqdm() 方法

tqdm&#xff08;阿拉伯语"taqaddum"的缩写&#xff0c;意为"进展"&#xff09;是Python中一个用于在循环中显示进度条的库。它提供了一种简单而又灵活的方式来监测代码执行的进度&#xff0c;特别是在处理大量数据或耗时较长的任务时非常有用。 1、安装 …

golang 解析oracle 数据文件头

package mainimport ("encoding/binary""fmt""io""os" ) // Powered by 黄林杰 15658655447 // Usered for parser oracle datafile header block 1 .... // oracle 数据文件头块解析 // KCBlockStruct represents the structure of t…

什么是美颜SDK?美颜SDK对比评测

美颜SDK在视频直播中发挥着越来越重要的作用。为了实现实时、高质量的美颜效果&#xff0c;各种视频直播美颜SDK应运而生。本文将对这些技术进行深入解析与比较。 一、技术原理解析 深度学习技术通过大量的训练数据学习人脸特征&#xff0c;从而实现更为自然的美颜效果。传统…

干货分享:如何提高商城系统网页访问速度?

如今&#xff0c;商城系统网页的访问速度对于用户体验和销售业绩至关重要。用户对于网页的加载速度要求越来越高&#xff0c;一旦加载速度过慢&#xff0c;用户可能会选择离开&#xff0c;甚至转向竞争对手的网站。因此&#xff0c;提高商城系统网页的打开速度是每个电商运营者…

2023年【N1叉车司机】找解析及N1叉车司机复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年N1叉车司机找解析为正在备考N1叉车司机操作证的学员准备的理论考试专题&#xff0c;每个月更新的N1叉车司机复审模拟考试祝您顺利通过N1叉车司机考试。 1、【多选题】《中华人民共和国特种设备安全法》第八十三…

ROS1 学习11 坐标系tf 管理系统 简介及demo示例

坐标系是我们非常熟悉的一个概念&#xff0c;也是机器人学中的重要基础&#xff0c;在一个完整的机器人系统中&#xff0c;会存在很多坐标系&#xff0c;这些坐标系之间的位置关系该如何管理&#xff1f; ROS给我们提供了一个坐标系的管理神器——TF。 比如在机械臂形态的机器…

ubuntu 20.04+ORB_SLAM3 安装配库教程

目录 安装ros(如果只是运行ORB-SLAM3&#xff0c;可以跳过安装)0. ros 安装教程1. 安装opencv2. 安装Pangolin3. 安装Eigen34.安装Python & libssl-dev5.安装boost库6.安装ceres库&#xff08;不必须&#xff09;7.安装Sophus库&#xff08;不必须&#xff09;8. 安装g20库…