vscode + CMake编译(opencv显示图片工程)
1.opencv
1.1Mat容器:
在OpenCV中,cv::Mat
是一个重要的类,用于表示和操作矩阵或多维数组,通常用于图像处理和计算机视觉任务。
cv::Mat
类具有以下特点和功能:
-
多维数据存储:
cv::Mat
可以存储多维数据,包括图像、矩阵、向量等。它是一个灵活的数据容器,可以存储不同类型和大小的数据。 -
数据访问和操作:
cv::Mat
提供了各种方法来访问和操作数据。你可以使用下标运算符()
访问和修改单个元素,也可以使用迭代器遍历矩阵中的所有元素。此外,还有一些便捷的函数和运算符可用于常见的矩阵操作,如转置、缩放、裁剪等。 -
数据类型和通道:
cv::Mat
支持不同的数据类型,如整数、浮点数和复数。它还可以存储多通道数据,例如彩色图像的三通道(BGR 或 RGB)表示。 -
内存管理:
cv::Mat
使用智能指针技术,自动管理底层数据的内存。它可以自动分配和释放内存,使得内存管理变得更加方便和安全。 -
与其他数据结构的互操作性:
cv::Mat
可以与其他数据结构进行互操作。它可以与标准C++数组、STL容器以及其他OpenCV数据结构(如cv::Point
和cv::Rect
)进行无缝集成。
Mat基本上是一个具有两个数据部分的类:①矩阵头:大小,存储的方法,地址等 ;②矩阵指针:指向实际数据存储区域的指针;
Mat对象都有自己的头部,但通过使他们的指针指向相同的地址,矩阵可以在他们两个实例中共享。
Mat A, C; // 创建两个MAT容器的对象头
A = imread(argv[1], IMREAD_COLOR); // 为A对象添加实际的矩阵数据,imread() 返回的就是一个Mat对象。
Mat B(A); // 使用拷贝构造函数创建Mat对象B
C = A; // 修改操作
上述的所有对象,最后指向相同的数据矩阵,但它们拥有自己的头部;使用它们中的任何一个对象修改矩阵都会影响其他的对象。
可以询问矩阵本身是否属于多个Mat对象,它们在不再需要时负责清理它。
这是通过使用引用计数机制来处理的。每当有人复制Mat对象的标题时,矩阵的计数器就会增加。每当头部被清洁时,这个计数器就会减少。当计数器达到零时,矩阵也被释放。有时你也想复制矩阵本身,所以OpenCV提供了cv :: Mat :: clone()和cv :: Mat :: copyTo()函数。
Mat F = A.clone(); //F和A将不会采用同一个引用计数系统
Mat G;
A.copyTo(G); // 现在修改F和G都不会影响A
1.2 imread()函数
imread()
函数返回一个cv::Mat
对象,表示读取的图像数据。
cv::Mat cv::imread(const std::string& filename, int flags = cv::IMREAD_COLOR);
filename:要读取的图像文件的路径和名称。
flags:可选参数,用于指定图像的读取方式。默认为cv::IMREAD_COLOR,表示以彩色方式读取图像。
以下是flags参数的可选值:cv::IMREAD_COLOR:以彩色方式读取图像,忽略图像的透明度通道(默认)。cv::IMREAD_GRAYSCALE:以灰度方式读取图像,将图像转换为单通道灰度图像。cv::IMREAD_UNCHANGED:以原始方式读取图像,包括图像的通道和透明度通道。
1.3 imshow()函数
imshow()
函数将指定的图像数据显示在一个窗口中。窗口的大小会自动根据图像的大小进行调整。如果窗口不存在,则会创建一个新窗口并显示图像;如果窗口已存在,则会更新窗口中显示的图像。
void cv::imshow(const std::string& winname, cv::InputArray mat);
winname:窗口的名称,用于标识不同的窗口。
mat:要显示的图像数据,可以是cv::Mat对象或其他支持的图像数据类型。
1.4 cvtcolor()函数
cvtColor()
是OpenCV库中用于图像颜色空间转换的函数。它可以将图像从一个颜色空间转换为另一个颜色空间
void cv::cvtColor(cv::InputArray src, cv::OutputArray dst, int code, int dstCn = 0);
src:输入图像的数据,可以是cv::Mat对象或其他支持的图像数据类型。
dst:输出图像的数据,用于存储转换后的图像数据,可以是cv::Mat对象或其他支持的图像数据类型。
code:颜色空间转换的代码,用于指定源图像和目标图像的颜色空间。具体的转换代码由OpenCV提供,如cv::COLOR_BGR2GRAY表示将BGR图像转换为灰度图像。
dstCn:可选参数,表示目标图像的通道数。默认为0,表示目标图像的通道数与源图像的通道数相同。
1.5 resize()函数
void cv::resize(cv::InputArray src, cv::OutputArray dst, cv::Size dsize, double fx = 0, double fy = 0, int interpolation = cv::INTER_LINEAR);
src:输入图像的数据,可以是cv::Mat对象或其他支持的图像数据类型。
dst:输出图像的数据,用于存储调整大小后的图像数据,可以是cv::Mat对象或其他支持的图像数据类型。
dsize:目标图像的尺寸,用cv::Size(width, height)指定。
fx:可选参数,水平方向的缩放比例因子。默认为0,表示根据目标图像的宽度自动计算缩放比例。
fy:可选参数,垂直方向的缩放比例因子。默认为0,表示根据目标图像的高度自动计算缩放比例。
interpolation:可选参数,用于指定插值方法。默认为cv::INTER_LINEAR,表示使用双线性插值进行图像的缩放。
1.6 puttext()函数
void cv::putText(cv::InputOutputArray img, const std::string& text, cv::Point org, int fontFace, double fontScale, cv::Scalar color, int thickness = 1, int lineType = cv::LINE_8, bool bottomLeftOrigin = false);
2.Cmake
2.1 简介
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件;Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用;CMake 的组态档取名为 CMakeLists.txt;
2.2 vscode使用CMake
①下载CMake:
Download CMake
②系统环境配置好:
根据cmake的安装位置去添加,可以在cmd中,测试是否成功。
③安装两个插件:
确保你的vscode本来就是可以跑的,可以上网搜一下vscode环境配置
④创建文件夹:
src:存放源文件;inc:存放头文件;build:执行cmake会生成一些配置文件比较杂,放在该目录下;bin:存放生成的可执行程序;CmakeLists.txt文件;
⑤编写一个简单的OpenCV示例代码(.cpp):
#include <iostream>
#include <opencv2/opencv.hpp> // 包含opencv的库头文件using namespace std;
using namespace cv; //使用命名空间cv,包含空间中方法及属性int main(int argc, char** argv )
{if ( argc != 2 ) // 命令行参数个数不是2个的时候{printf("使用指令: DisplayImage <Image_Path>\n"); // 提示:按照固定格式输入指定内容!return -1;}Mat img; //创建一个名称为img的图像容器(这个后边会介绍到)img = imread( argv[1], 1 ); //为该容器读取命令行中 DisplayImage 之后的参数(图片路径“<Image_Path>”)if ( !img.data ) //如果读取数据为空(没有读取到图片){cout<<"没有图片数据!"<<endl;return -1;}namedWindow("检索到的图片", WINDOW_AUTOSIZE );//创建图片显示窗口imshow("Display Image", img);//显示图片waitKey(0); //延迟等待return 0;
}
⑥编写CMakeList.txt:
# 选择最匹配的最低的Cmake版本
cmake_minimum_required(VERSION 2.8)
# 创建的程序的名称(项目的名称)
project( DisplayImage )
#指定头文件的路径,PROJECT_SOURCE_DIR宏对应的值是工程的根目录
include_directories(${PROJECT_SOURCE_DIR}/inc)
find_package( OpenCV REQUIRED ) # 找到需求的库或者组件
#[[aux_source_directory(< dir > < variable >)dir:要搜索的目录variable:将从dir目录下搜索到的源文件列表存储到该变量中
]]
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRCS)
#设置可执行程序路径,EXECUTABLE_OUTPUT_PATH是可执行路径的宏
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#生成可执行程序 add_executable(可执行程序名 源文件名称)
add_executable( DisplayImage ${SRCS})
#链接的库
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
⑦生成可执行文件:
进入build目录下敲击以下命令表示cmake指定MinGW编译生成makefile
cd <DisplayImage_directory> /bulid/ # 切换到项目路径bulid当中
cmake .. -G "MinGW Makefiles" # 编译当前项目
ming32-make # 生成可执行文件(名称为Cmake文件中的project()中的名称)
ps另一种方法:
在setting中加这一句:
在vscode中可以使用ctrl+shift+p,搜索CMake:Configure
点击效果如下
生成了makefile之后,在终端make生成可执行文件
⑧执行程序:
cd ../bin/ #跳转到可执行文件的目录
./DisplayImage xxx.jpg #添加要显示的图片(图片路径),并且执行
相关文章:

vscode + CMake编译(opencv显示图片工程)
1.opencv 1.1Mat容器: 在OpenCV中,cv::Mat是一个重要的类,用于表示和操作矩阵或多维数组,通常用于图像处理和计算机视觉任务。 cv::Mat类具有以下特点和功能: 多维数据存储:cv::Mat可以存储多维数据&…...

JavaScript的学习之强制类型转换
目录 一、什么是强制类型转换 二、其他类型转化为String类型 方式一:调用被转化数据类型的toString()方法 方式二:调用String函数,并将我们要转换的数据添加进去为参数 三、其他类型转化为Number类型 方式一:使用Number()函数…...

天润融通:AI赋能客户体验,推动企业收入和业绩增长
“客户体验已经成为全球企业差异化的关键。人工智能与数据分析等创新技术正在加速推动企业在客户体验计划中取得成功,以保持领先地位”。Customer Insights & Analysis 研究经理Craig Simpson说道。 客户体验 (CX,Customer Experience) 是客户在与企…...
Android与服务器交互的方式中的对称加密和非对称加密(kotlin)
Android与服务器交互中的对称加密和非对称加密(kotlin) 引言 在 Android 与服务器交互时,我们常常需要进行数据传输,为了保证数据的安全性,我们可以使用加密算法来保护数据。在本文中,我们将介绍如何在 K…...
epoch和batch的区别
在机器学习和深度学习中,“epoch”(批次)和"batch"(批量)是两个重要的概念,它们分别表示训练过程中的不同阶段和数据处理方式。 Epoch(批次) 定义:Epoch&…...
非递归创建二叉查找树
非递归创建二叉查找树代码。 #include <stdio.h> #include <stdlib.h>typedef int KeyType; typedef struct BSTNode{KeyType key;struct BSTNode *lchild,*rchild; }BSTNode,*BiTree;//王道书上的递归写法,代码简单,但是理解有难度 //int …...

摄影师危!AI绘画即将降维打击摄影行业
你还以为AI绘画影响的只是插画师行业吗?错了,摄影行业也即将面临技术洗牌 话不多说,先看一下这几张图 你能一眼看出这是AI画的迪丽热巴吗? 你是不是还以为AI绘画只能画点动漫艺术风格?那你就低估了AI的发展速度&…...
ts 中class
class obj{name:stringage:numberconstructor(name:string,age:number){this.name namethis.age age}setname(){this.name 111 } } //新建实例 //构造方法中的this指向调用者,谁new就指向谁 //这个this 指向 o,打印this,可以获取到o身上的…...
深度解析RocketMq源码-高可用存储组件(四)Dledger框架日志同步流程
1.绪论 在深度解析RocketMq源码-高可用存储组件(一) raft协议详解-CSDN博客 中讲过,raft协议中,日志同步主要有两个地方,一个是leader会跟follower同步数据,另一个是在新leader诞生的时候,会与…...

ONLYOFFICE 文档开发者版 8.1:API 更新
随着版本 8.1 新功能的发布,我们更新了编辑器、文档生成器和插件的 API,并添加了 Office API 板块。阅读下文了解详情。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器,支持处理文本文档、电子表格、演示文稿、可填写…...
Activemq单节点在Windows下的配置部署
1.环境信息 服务器信息jdk版本activemq版本备注Windows Server 2008R2 Enterprisejdk-17_windows-x64_bin.exeapache-activemq-5.18.42.jdk配置 1.下载jdk 地址: Java Downloads | Oracle 中国 2.上传至Windows服务器,点击安装,在选择安装目录页面,选择合适的安装目录即…...

SpringBoot-注解@ImportResource引入自定义spring的配置xml文件和配置类
1、注解ImportResource 我们知道Spring的配置文件是可以有很多个的,我们在web.xml中如下配置就可以引入它们: SprongBoot默认已经给我们配置好了Spring,它的内部相当于已经有一个配置文件,那么我们想要添加新的配置文件怎么办&am…...

GitLab配置免密登录之后仍然需要Git登录的解决办法
GitLab配置免密登录之后仍然需要Git登录的解决办法 因为实习工作需要,要在本地拉取gitlab上的代码,设置了密钥之后连接的时候还需要登录的token,摸索之后有了下面的解决办法。 方法一: 根据报错的提示,去网站上设置个人…...

探索小众爱好:打造个人韧性与特色之路
在这个信息爆炸的时代,我们很容易陷入“千篇一律”的漩涡中,无论是生活方式还是兴趣爱好,似乎都趋向于某种“流行”或“热门”。然而,真正的个性与魅力,往往来源于那些不为大众所知的小众爱好。今天,我想和…...
GitHub使用教程(小白版)
看一百篇文章不如自己写一篇 第一步:注册和安装 注册GitHub账号 访问 GitHub官网。点击右上角的 "Sign up" 按钮。按照提示输入你的邮箱、创建用户名和密码,完成注册。 安装Git 访问 Git官网。下载并安装适用于你操作系统的Git。安装…...

深度解析SD-WAN在企业组网中的应用场景
在现代企业快速发展的网络环境中,SD-WAN技术不仅是实现企业各站点间高效连接的关键,也是满足不同站点对互联网、SaaS云应用和公有云等多种业务需求的理想选择。本文将从企业的WAN业务需求出发,对SD-WAN的组网场景进行全面解析,涵盖…...
【INTEL(ALTERA)】Eclipse Nios II SBT 无法从模板创建新应用程序和 BSP
目录 说明 解决方法 说明 您应该能够创建新的应用程序和 BSP 模板包含以下步骤: 选择 Nios II应用程序和 BSP 来自模板。选择您的.sopcinfo 文件并选择模板。从您的工作区单击 选择现有的 BSP 项目。单击 创建。选择所需的 BSP 选项。单击 完成。 但是…...

Vue_cli搭建过程项目创建
概述 vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速&am…...

面试题4:POST 比 GET 安全?
不是。HTTP就没有加密功能。 我们知道 GET一般将参数放到URL的查询字符串中,如果是实现登录页面,我们的用户名和密码就直接显示到浏览器的地址栏中了,此时就会轻易的被他人获取账号密码,很不安全。而POST会把参数放到 body 里&am…...

Github生成Personal access tokens及在git中使用
目录 生成Token 使用Token-手工修改 使用Token-自动 生成Token 登录GitHub,在GitHub右上角点击个人资料头像,点击Settings → Developer Settings → Personal access tokens (classic)。 在界面上选择点击【Generate new token】,填写如…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...