OpenCV基础demo

一、读取图像

//图片路径QString appPath = QCoreApplication::applicationDirPath();QString imagePath = appPath + "/sun.png";//读取图像cv::Mat img = cv::imread(imagePath.toStdString()); //IMREAD_GRAYSCALE 灰度图 IMREAD_UNCHANGED 具有透明通道if (img.empty()) {qDebug()<< "Could not load image!\n";return;}//创建窗口cv::namedWindow("input", cv::WINDOW_AUTOSIZE);//显示图像cv::imshow("input", img);//参数为0一直阻塞cv::waitKey(0);//销毁窗口cv::destroyAllWindows();

二、保存图像

//保存为png透明通道vector<int>opts;opts.push_back(IMWRITE_PAM_FORMAT_RGB_ALPHA);imwrite("D:/img_bgra.png", img, opts);//保存为单通道灰度图像img = cv::imread(imagePath.toStdString(), IMREAD_GRAYSCALE);vector<int> opts_gray;opts_gray.push_back(IMWRITE_PAM_FORMAT_GRAYSCALE);imwrite("D:/img_gray.png", img, opts_gray);//保存为默认的彩色BGR图像imwrite("D:/img_BGR.png", img);//保存为png彩色压缩图像img = imread(imagePath.toStdString(), IMREAD_ANYCOLOR);vector<int> opts_png_anycolor;opts_png_anycolor.push_back(IMWRITE_PAM_FORMAT_GRAYSCALE);opts_png_anycolor.push_back(9);imwrite("D:/img_png_anycolor.png", img, opts_png_anycolor);//保存为JPG高压缩比图像img = imread(imagePath.toStdString(), IMREAD_COLOR);vector<int> opts_jpeg;opts_jpeg.push_back(IMWRITE_JPEG_QUALITY);opts_jpeg.push_back(50);opts_jpeg.push_back(IMWRITE_JPEG_OPTIMIZE);opts_jpeg.push_back(1);imwrite("D:/img_jpeg.jpg", img, opts_jpeg);

三、加载视频

	//视频路径QString appPath = QCoreApplication::applicationDirPath();QString videoPath = appPath + "/vtest.avi";cv::VideoCapture capture;capture.open(videoPath.toStdString(),CAP_FFMPEG);//从摄像头读取//capture.open(0, CAP_DSHOW);cv::Mat frame;while (true) {//读帧bool ret = capture.read(frame);if (!ret)break;imshow("frame", frame);//添加帧处理 等待 100 毫秒,检查用户是否按下键盘上的按键char c = waitKey(100);//按下的是 ESC 键 (ASCII 值为 27),则跳出循环,停止播放视频if (c == 27)break;}waitKey(0);destroyAllWindows();

四、获取视频属性

	//视频路径QString appPath = QCoreApplication::applicationDirPath();QString videoPath = appPath + "/vtest.avi";cv::VideoCapture capture;capture.open(videoPath.toStdString(),CAP_FFMPEG);qDebug() << u8"高:" << capture.get(CAP_PROP_FRAME_HEIGHT);qDebug() << u8"宽:" << capture.get(CAP_PROP_FRAME_WIDTH);qDebug() << u8"帧率FPS:" << QString::number(capture.get(CAP_PROP_FPS));qDebug() << u8"总帧率:" << capture.get(CAP_PROP_FRAME_COUNT);

五、保存视频

	//视频路径QString appPath = QCoreApplication::applicationDirPath();QString videoPath = appPath + "/vtest.avi";cv::VideoCapture capture;capture.open(videoPath.toStdString(), CAP_FFMPEG);qDebug() << u8"高:" << capture.get(CAP_PROP_FRAME_HEIGHT);qDebug() << u8"宽:" << capture.get(CAP_PROP_FRAME_WIDTH);qDebug() << u8"帧率FPS:" << capture.get(CAP_PROP_FPS);qDebug() << u8"总帧率:" << capture.get(CAP_PROP_FRAME_COUNT);//保存视频路径QString savevideoPath = appPath + "/output.avi";cv::VideoWriter writer(savevideoPath.toStdString(), capture.get(CAP_PROP_FOURCC), capture.get(CAP_PROP_FPS), Size(capture.get(CAP_PROP_FRAME_WIDTH), capture.get(CAP_PROP_FRAME_HEIGHT)));cv::Mat frame;while (true) {//读帧bool ret = capture.read(frame);if (!ret)break;imshow("frame", frame);//添加帧处理 writer.write(frame);//等待 100 毫秒,检查用户是否按下键盘上的按键char c = waitKey(100);//按下的是 ESC 键 (ASCII 值为 27),则跳出循环,停止播放视频if (c == 27)break;}capture.release();writer.release();waitKey(0);destroyAllWindows();

六、Mat遍历

  1. 数组下标
for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){if (dim == 1)//灰度图像{int pv = image.at<uchar>(row,col);//像素是字节类型image.at<uchar>(row, col) = 255 - pv;}if (dim == 3)//彩色图像{Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}}
  1. 指针
for (int row = 0; row < h; row++)
{uchar* current_row = image.ptr<uchar>(row);for (int col = 0; col < w; col++){if (dim == 1)//灰度图像{int pv = *current_row;*current_row++ = 255 - *current_row;}if (dim == 3)//彩色图像{*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}
}

七、Mat加减乘除

#include <opencv2/opencv.hpp>using namespace cv;int main() {Mat image = imread("image.jpg");if (image.empty()) {std::cout << "无法加载图像" << std::endl;return -1;}// 加法变换Mat addResult;add(image, Scalar(50, 50, 50), addResult); // 将像素值增加50// 减法变换Mat subtractResult;subtract(image, Scalar(50, 50, 50), subtractResult); // 将像素值减去50// 乘法变换Mat multiplyResult;multiply(image, Scalar(0.5, 0.5, 0.5), multiplyResult); // 将像素值乘以0.5// 除法变换Mat divideResult;divide(image, Scalar(2.0, 2.0, 2.0), divideResult); // 将像素值除以2.0imshow("Original Image", image);imshow("Addition Result", addResult);imshow("Subtraction Result", subtractResult);imshow("Multiplication Result", multiplyResult);imshow("Division Result", divideResult);waitKey(0);return 0;
}

七、亮度调节demo

Mat src, dst, m;
int lightness = 50;static void on_track(int, v

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

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

相关文章

C++ STL - 优先级队列及其模拟实现

目录 0. 引言 1. priority_queue 介绍 1.1 构造函数 1.2 priority_queue 接口函数使用 1.3 仿函数 1.4 题目练习 2. priority_queue 模拟实现 2.1基本框架&#xff1a; 2.2 默认构造函数 2.3 基本函数 2.4 堆的向上以及向下调整 0. 引言 优先队列 (priority_queu…

【剑指offr--C/C++】JZ22 链表中倒数最后k个结点

一、题目 二、思路及代码 遍历链表并存入vector容器&#xff0c;通过下标取出对应位置元素或者返回空 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <cstddef> #include <iterator> #…

【微服务】接口幂等性常用解决方案

一、前言 在微服务开发中&#xff0c;接口幂等性问题是一个常见却容易被忽视的问题&#xff0c;同时对于微服务架构设计来讲&#xff0c;好的幂等性设计方案可以让程序更好的应对一些高并发场景下的数据一致性问题。 二、幂等性介绍 2.1 什么是幂等性 通常我们说的幂等性&…

【Entity Framework】 EF三种开发模式

【Entity Framework】 EF三种开发模式 文章目录 【Entity Framework】 EF三种开发模式一、概述二、DataBase First2.1 DataBase First简介2.2 DataBase First应用步骤2.3 DataBase First总结 三、Model First3.1 Model First简介3.2 Model First实现步骤 四、Code First4.1 Cod…

全市场都忽视了!大摩:数据中心算力成本正在迅速下降

随着AI技术迈入普及与应用的新纪元&#xff0c;其算力需求蓬勃增长的同时&#xff0c;算力成本随技术进步呈现下降趋势。 摩根士丹利在3月24日的AI报告中指出&#xff0c;随着GPU技术的不断进步&#xff0c;例如英伟达从Hopper发展到Blackwell GPU架构&#xff0c;GAI的算力成…

怎么做到高效阅读、高效输出?

每一位得到的用户都是终身学习者&#xff0c;你一定对读书这件事不陌生。但是&#xff0c;并不是每个人都清楚&#xff0c;应该用什么标准选书&#xff0c;又怎么把一本书变成自己的精神资产。而这件事&#xff0c;陈章鱼特别擅长。 今天&#xff0c;我和陈章鱼一起挑选了4个有…

ChatGPT 对 ELT的理解

本文主要内容来自 ChatGPT 4.0 到底什么是 ETL&#xff1f;在数据库内部&#xff0c;把数据从 ODS 层加工成 DWD&#xff0c;再加工成 DWS&#xff0c;这个过程和 ETL 的关系是什么&#xff1f;带着这些问题&#xff0c;我问了一下 ChatGPT&#xff0c;总结如下。 数据在两个数…

线程安全介绍

线程安全的出现&#xff1a; 当两个或以上的线程同时操作一个共享变量时&#xff0c;就会涉及线程安全问题&#xff0c;不然会导致最后结果并不是我们所需要的。 线程安全定义&#xff1a; 线程安全&#xff08;Thread Safety&#xff09;是指一个对象或代码块在多线程环境中…

AWS EC2设置root登录

在使用亚马逊的服务器时&#xff0c;官方默认是使用密钥登录&#xff0c;跟国内的云服务器差别较大&#xff0c;本文记录下&#xff0c;如何开放AWS EC2的root登录。 一、通过网页版或者XShell登录服务器 这里略过 二、设置root账户密码 # 切换 root sudo -i # 设置或修改密…

【408直通车】(考研数一、二、三合集)线性代数公式全覆盖

线性代数 行列式: ∣ A B ∣ ∣ A ∣ ∣ B ∣ ∣ B ∣ ∣ A ∣ ∣ B A ∣ |AB| |A||B| |B||A| |BA| ∣AB∣∣A∣∣B∣∣B∣∣A∣∣BA∣ ∣ k A ∣ k n ∣ A ∣ |kA| k^n |A| ∣kA∣kn∣A∣ ∣ A T ∣ ∣ A ∣ |A^T| |A| ∣AT∣∣A∣ ∣ A − 1 ∣ ∣ A ∣ −…

静态住宅IP VS 动态住宅IP,怎么选择?

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…

CBLUEbenchmark代码跑通

CBLUEbenchmark 跑通 github源地址 1.配置 数据下载 新建文件夹CLBUEDatasets,将数据放在该文件夹下模型下载到github源地址中选择一个模型来下载: 将下载好的模型放在一个专门放模型的文件夹下&#xff0c;我这里是bert 文件如下所示放置&#xff1a; 2.训练模型&#xff…

宁德时代与特斯拉合作;钟睒睒连续四次中国首富丨 RTE 开发者日报 Vol.171

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

用java做一个双色球彩票系统

代码如下&#xff1a; import java.util.Random; public class HelloWorld{public static void main(String[] args){//1、生成中奖号码 int[] arrcreateNumber();for (int i 0;i<arr.length;i) {System.out.print(arr[i]" ");}}public static int[] createNu…

OJ刷题:字符串中的第一个唯一字符

力扣第387题&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入: s "leetcode"…

全自动引流,每日500+粉丝的秘诀

在如今竞争激烈的市场环境下&#xff0c;如何有效地吸引和保持精准粉丝成为了每个企业主或网红必须面对的问题。然而&#xff0c;许多人可能误以为全自动引流就意味着无人参与&#xff0c;实际上&#xff0c;它更多的是借助一些自动化工具和策略来提升我们的工作效率。今天&…

Flink Temporal Join 系列 (2):用 Temporal Table DDL 实现基于处理时间的关联

本文要演示的是:使用 Temporal Table DDL 定义被关联表(维表),然后基于主动关联表(事实表)的“处理时间”去进行Temporal Join(关联时间维度上对应版本的维表数据)。该演示涉及三个要点: 被关联的表(维表)是用 Temporal Table DDL 形式定义,必须是一张时态表(版本…

阿尔吉侬的花束 (典bfs)

0326重写&#xff0c;一个小时终于成功了 #include<algorithm> #include<iostream> #include<cstring> #include<queue>using namespace std;int t; int r,c; char mp[210][210]; bool vis[210][210]; struct node{int x,y; }; int dx[] {1,-1,0,0};…

EtherCAT主站SOEM -- 21 --Qt-Soem通过 CST模式(周期同步力矩模式)控制一个电机转圈圈

EtherCAT主站SOEM -- 21 --Qt-Soem通过 CST模式(周期同步力矩模式)控制一个电机转圈圈 0 QT-SOEM视频预览及源代码下载:0.1 QT-SOEM视频预览0.2 QT-SOEM源代码下载PS 特别注意1 程序文件修改替换1.1 allvalue.h1.2 motrorcontrol.h1.3 mainwindow.cpp1.4 motrorcontrol.cpp2…