【OpenCV C++20 学习笔记】图片处理基础

OpenCV C++20 图片处理基础

  • VS 2022 C++20 标准库导入的问题
  • 头文件包含以及命名空间声明
  • main函数
    • 读取图片
    • 读取检查
    • 显式图片
    • 写入图片
  • 完整代码
  • bug

VS 2022 C++20 标准库导入的问题

VS还没有完全兼容C++20。C++20的import语句不一定能正确导入标准库,所以必须要新建一个头文件专门用来编译标准库的导入语句。具体配置见本文绑定的资源。
如果使用的是C++20之前的版本,则直接用#include导入标准库以及OpenCV模块即可。
对于C++20的使用有什么问题欢迎私信我或评论。

头文件包含以及命名空间声明

资源中的模板项目已经包含了3个OpenCV常用的头文件:

  1. core:定义了OpenCV中的一些基础模块
  2. imgcodecs:提供了读和写的方法
  3. highgui:包含了在窗口中显示图片的方法

在该项目中也要进行控制台的输出操作,所以也导入了<iostream>模块,用的是C++20中的import语句。
注意:在C++20中,#include必须要写在文件的开头,不能放在import的下面

接着,声明OpenCV的命名空间using namespace cv;,以及std的命名空间。
main函数前的一些操作如下:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>import <iostream>;using namespace cv;
using namespace std;

main函数

这里的代码和OpenCV官方文档中,Getting Started with Images一章中的代码类似,详情请见一下链接
link

读取图片

该项目从OpenCV的示例中读取starry_night.jpg图片。

  • 首先,用一个字符串来储存图片的地址;
  • 然后,创建一个Mat对象来存储读入的图片。
    读取图片的函数为cv::imread。这里传入了两个参数:
  • 图片地址(字符串)
  • 读取格式(可选),有以下几种:
    • IMREAD_COLOR:以BGR8比特格式导入,是默认的格式
    • IMREAD_UNCHANGED:以原有格式导入(如果有alpha通道则会包含)
    • IMREAD_GRAYSCALE :以灰度格式导入
string image_path = "OIP-C.jpg;
Mat img = imread(image_path, IMREAD_COLOR);

OpenCV支持的图片格式包括:bmp, pbm, pgm, ppg, sr, ras, jpg, jpeg, jpe, jp2, tiff, tif, png。

读取检查

检查图片是否读取成功
empty()函数来进行判断。如果结果为true,即Mat对象为空,则在控制台输出信息,并结束main程序。

if (img.empty()) {cout << "不能读取图片:" << image_path << endl;return 1;
}

显式图片

cv::imshow函数显式图片。该函数共传入两个参数

  • 图片显示窗口的标题(字符串)
  • 储存图片信息的Mat对象

接着,为了让用户按下键盘按键的时候结束显式,代码运用了cv::waitKey函数。这个函数只有一个参数:

  • 在用户按键操作前的等待时间(以毫秒为单位);0代表一直等待,直到有按键操作;该函数会以整数的形式返回用户所按下的键
imshow("显式图片", img);
int k = waitKey(0);

写入图片

最后,如果用户按下的是“s”键,程序就会在将Mat中储存的图片信息以png格式写入当前路径
写入图片的函数是cv::imwrite,传入两个参数

  • 写入地址(字符串)
  • 储存图片信息的Mat对象
if (k == 's') {imwrite("OIP-C.png", img);
}

完整代码

#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>import <iostream>;using namespace cv;
using namespace std;int main() {string image_path = "OIP-C.jpg";Mat img = imread(image_path, IMREAD_COLOR);if (img.empty()) {cout << "不能读取图片:" << image_path << endl;return 1;}imshow("显式图片", img);int k = waitKey(0);if (k == 's') {imwrite("OIP-C.png", img);}
}

bug

图片能正常读取,但是按下“s”键写入之后会报错
程序报错
但是强行结束程序之后发现图片已经成功写入。尚未找出原因,有待进一步研究。

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

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

相关文章

WebGIS的地图渲染|SVG|Canvas|Canvas

说到地图&#xff0c;平时我们使用过百度地图、高德地图、腾讯地图等&#xff0c;如果涉及地图开发需求&#xff0c;也有很多选择&#xff0c;如前面提到的几个地图都会提供一套JS API&#xff0c;此外也有一些开源地图框架可以使用&#xff0c;如OpenLayers、Leaflet、Mapbox、…

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建&#xff0c;即 vue create projectName 但是官方更推荐 vite 创建&#xff0c;即 npm create vuelatest&#xff0c;然后从项目名开始配置 总结&#xff1a;入口在 index.html&#xff0c;它会引入 main.ts&#xff0c;…

开源XDR-SIEM一体化平台 Wazuh (1)基础架构

简介 Wazuh平台提供了XDR和SIEM功能&#xff0c;保护云、容器和服务器工作负载。这些功能包括日志数据分析、入侵和恶意软件检测、文件完整性监控、配置评估、漏洞检测以及对法规遵从性的支持。详细信息可以参考Wazuh - Open Source XDR. Open Source SIEM.官方网站 Wazuh解决…

基于x86+FPGA+AI无风扇准系统,AFC自动售检票系统控制器

冰翅无风扇准系统&#xff0c;AFC自动售检票系统建设的理想选择 在交通强国、智慧交通建设的大背景下&#xff0c;人工智能、大数据、计算机及网络技术等正加快融合应用到交通领域&#xff0c;助力提升出行服务的智能化、自动化水平。&#xff08;AFC&#xff09;自动售检票系…

基于 HTML+ECharts 实现的大数据可视化平台模板(含源码)

构建大数据可视化平台模板&#xff1a;基于 HTML 和 ECharts 的实现 大数据的可视化对于企业决策、市场分析和业务洞察至关重要。通过直观的数据展示&#xff0c;团队可以快速理解复杂的数据模式&#xff0c;发现潜在的业务机会。本文将详细介绍如何利用 HTML 和 ECharts 实现一…

qt--做一个拷贝文件器

一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位&#xff08;自适应&#xff09; 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类&#xff0c;直接使用静态…

UE4如何直接调试Game

某些功能在编辑器里不好调试&#xff0c;例如Pak&#xff0c;就需要直接调试 Game&#xff0c;做法是选择 Game&#xff0c;不要选择Client&#xff0c;加断点&#xff0c;然后点击 Debug 就好了。 断点调试成功&#xff1a; 同时看到界面&#xff1a;

【无人机】低空经济中5G RedCap芯片的技术分析报告

1. 引言 图一. 新基建&#xff1a;低空经济 低空经济作为一种新兴的经济形态&#xff0c;涵盖了无人机、电动垂直起降飞行器&#xff08;eVTOL&#xff09;、低空物流、空中交通管理等多个领域。随着5G网络的普及和演进&#xff0c;5G RedCap&#xff08;Reduced Capability&a…

pip install albumentations安装下载超级细水管

albumentations 是一个用于图像增强的 Python 库&#xff0c;它提供了丰富的图像变换功能&#xff0c;可以用于数据增强&#xff0c;从而提高深度学习模型的泛化能力。 直接安装命令&#xff1a; pip install albumentations但是如果半夜遇到这种19kB/s的下载速度 为头发着想&…

LeetCode24 两两交换链表中的节点

前言 题目&#xff1a; 24. 两两交换链表中的节点 文档&#xff1a; 代码随想录——两两交换链表中的节点 编程语言&#xff1a; C 解题状态&#xff1a; 没画图&#xff0c;被绕进去了… 思路 思路还是挺清晰的&#xff0c;就是简单的模拟&#xff0c;但是一定要搞清楚交换的…

STM32的外部中断详解

一、什么是中断&#xff1f; 想象一下你正在家里做饭&#xff0c;突然门铃响了&#xff0c;你听到门铃声后&#xff0c;会暂时放下手中的事情&#xff08;比如炒菜&#xff09;&#xff0c;去开门看看是谁。在这个例子中&#xff0c;门铃声就是一个“中断”&#xff0c;它打断…

使用puma部署ruby on rails的记录

之前写过一篇《记录一下我的Ruby On Rails的systemd服务脚本》的记录&#xff0c;现在补上一个比较政治正确的Ruby On Rails的生产环境部署记录。使用Puma部署项目。 创建文件 /usr/lib/systemd/system/puma.service [Unit] DescriptionPuma HTTP Server DocumentationRuby O…

快速入门了解Ajax

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Ajax的初识 意义&#xff1a;AJAX&#xff08;Asynchronous JavaScript and…

rce漏洞-ctfshow(50-70)

Web51 if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\|\%|\x09|\x26/i", $c)){ system($c." >/dev/null 2>&1"); } Nl&#xff0c;绕过tac&#xff0c;cat&#xff0c;绕…

Rce漏洞复习(ctfshow29-50)

Rce漏洞简介思维导图 Web29 代码审计&#xff1a; if(!preg_match("/flag/i", $c)){ eval($c); 传参没有flag&#xff08;大小写都没有出现&#xff09; Payload&#xff1a; ?csystem("ls"); ?csystem("tac *lag.php"); Web30 代码…

【网络流】——初识(最大流)

网络流-最大流 基础信息引入一些概念基本性质 最大流定义 Ford–Fulkerson 增广Edmons−Karp算法Dinic 算法参考文献 基础信息 引入 假定现在有一个无限放水的自来水厂和一个无限收水的小区&#xff0c;他们之间有多条水管和一些节点构成。 每一条水管有三个属性&#xff1a…

rust 初探 -- use

rust 初探 – use Package, Crate, 定义 Module use 关键字 作用&#xff1a;将路径引入到作用域内&#xff0c;其依旧遵循私有性规则&#xff0c;也即只用 pub 的部分引入进来才能使用 use crate::front_of_house::hosting; // 绝对路径 // use front_of_house::hosting; …

【微信小程序实战教程】之微信小程序 WXML 语法详解

WXML语法基础 从本章开始&#xff0c;我们就正式进入到了小程序项目开发学习的初级阶段&#xff0c;本章将介绍小程序的界面构成。有过网页开发学习经历的同学都知道&#xff0c;网页开发所使用的技术是HTML、CSS和JS&#xff0c;其中HTML用于描述整个网页的结构&#xff0c;也…

php反序列化--前置知识

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

Golang | Leetcode Golang题解之第274题H指数

题目&#xff1a; 题解&#xff1a; func hIndex(citations []int) int {// 答案最多只能到数组长度left,right:0,len(citations)var mid intfor left<right{// 1 防止死循环mid(leftright1)>>1cnt:0for _,v:range citations{if v>mid{cnt}}if cnt>mid{// 要找…