opencv常用API记录(C++版)

文章目录

  • 1. cv::Mat(cv::Rect) 是什么含义
  • 2. cv::Mat初始化 cv::Mat(1, 32, CV_32F,XXX)什么意思
  • 3. 如何使用opencv的多线程接口来跑多张图的resize

1. cv::Mat(cv::Rect) 是什么含义

cv::Mat(cv::Rect) 是一种使用矩形区域来构造新的 cv::Mat 对象的方式,其中 cv::Rect 是 OpenCV 库中的一个类,用于表示矩形区域的坐标和大小。

具体来说,cv::Mat(cv::Rect) 的含义是根据给定的矩形区域,在原始 cv::Mat 对象上提取或复制一个新的矩形区域,并将该区域作为一个新的 cv::Mat 对象返回。

下面是一个示例,演示了如何使用 cv::Mat(cv::Rect) 构造函数从原始图像中提取矩形区域:

#include <opencv2/opencv.hpp>int main() {cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);if (image.empty()) {return -1;}// 定义一个矩形区域(左上角坐标和宽高)cv::Rect roi(100, 100, 200, 150);// 使用矩形区域构造新的 Mat 对象cv::Mat regionOfInterest = image(roi);cv::imshow("Original Image", image);cv::imshow("Region of Interest", regionOfInterest);cv::waitKey(0);return 0;
}

在这个示例中,我们首先定义了一个矩形区域 roi,然后使用 image(roi) 来构造一个新的 cv::Mat 对象 regionOfInterest,该对象包含了原始图像中指定矩形区域的像素数据。

总之,cv::Mat(cv::Rect) 是一种通过矩形区域在原始图像上提取或复制像素数据来构造新的 cv::Mat 对象的方式。

2. cv::Mat初始化 cv::Mat(1, 32, CV_32F,XXX)什么意思

cv::Mat(1, 32, CV_32F, XXX) 是用于创建一个 cv::Mat 对象的构造函数调用,其中的参数表示以下内容:

  • 1:表示要创建的矩阵的行数。
  • 32:表示要创建的矩阵的列数。
  • CV_32F:表示矩阵的数据类型,这里是单精度浮点数(32 位浮点数)。
  • XXX:表示要初始化矩阵的数据。

具体来说,这个构造函数用于创建一个 1x32 大小的单精度浮点数矩阵,并且可以通过提供的数据 XXX 进行初始化。

以下是一个示例,演示了如何使用这个构造函数来初始化 cv::Mat 对象:

#include <opencv2/opencv.hpp>int main() {float initData[32] = {1.0, 2.0, 3.0, /* ... */, 31.0, 32.0};cv::Mat mat(1, 32, CV_32F, initData);// 输出矩阵内容std::cout << mat << std::endl;return 0;
}

在这个示例中,我们创建了一个 1x32 的单精度浮点数矩阵,并使用名为 initData 的数组进行了初始化。数组中的元素依次填充到矩阵的每个列。

总之,cv::Mat(1, 32, CV_32F, XXX) 构造函数调用用于创建一个特定大小和数据类型的 cv::Mat 对象,并通过提供的数据进行初始化。

3. 如何使用opencv的多线程接口来跑多张图的resize

    1. 单循环

使用 OpenCV 的多线程接口来同时处理多张图像的 cv::resize 操作可以提高图像处理的效率。OpenCV 提供了 cv::parallel_for_ 函数来实现多线程处理图像。

以下是一个示例,演示如何使用 OpenCV 的多线程接口来同时处理多张图像的尺寸调整操作:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/parallel/parallel.hpp>void resizeImages(cv::UMat& srcImage, cv::UMat& dstImage, const cv::Size& newSize) {cv::resize(srcImage, dstImage, newSize, 0, 0, cv::INTER_LINEAR);
}int main() {std::vector<cv::UMat> srcImages; // 源图像数组std::vector<cv::UMat> dstImages; // 目标图像数组// 加载图像并存储在源图像数组中(省略部分代码)// 定义目标尺寸cv::Size newSize(320, 240);// 使用多线程处理图像尺寸调整cv::parallel_for_(cv::Range(0, srcImages.size()), [&](const cv::Range& range) {for (int i = range.start; i < range.end; ++i) {cv::UMat dstImage;resizeImages(srcImages[i], dstImage, newSize);dstImages.push_back(dstImage);}});// 显示结果(省略部分代码)return 0;
}

在这个示例中,我们定义了一个函数 resizeImages,用于调整图像的尺寸。然后,使用 cv::parallel_for_ 函数在多个线程中并行处理图像的尺寸调整操作。通过这种方式,可以提高图像处理的效率。需要注意的是,在多线程环境下,确保线程安全,避免竞态条件和数据共享问题。

使用 cv::parallel_for_ 函数可以更有效地利用多核 CPU 来处理图像,但也要确保你的操作是线程安全的。如果操作涉及共享资源,需要进行适当的同步控制,以避免线程冲突。

    1. 双循环

cv::parallel_for_ 函数适用于并行处理单一循环范围,如果你想要并行处理双重循环并优化内层循环,可以将内层循环拆分成更小的任务单元,然后使用 cv::parallel_for_ 来处理每个内层任务。

以下是一个示例,演示如何使用 cv::parallel_for_ 并行处理双重循环,并针对内层循环进行优化:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/parallel/parallel.hpp>int main() {const int rows = 1000;const int cols = 1000;cv::Mat matA(rows, cols, CV_32FC1);cv::Mat matB(rows, cols, CV_32FC1);cv::Mat matC(rows, cols, CV_32FC1);// 初始化矩阵 A 和 B(省略部分代码)// 并行处理双重循环,优化内层循环cv::parallel_for_(cv::Range(0, rows), [&](const cv::Range& rowRange) {for (int i = rowRange.start; i < rowRange.end; ++i) {// 使用 cv::parallel_for_ 并行处理内层循环cv::parallel_for_(cv::Range(0, cols), [&](const cv::Range& colRange) {for (int j = colRange.start; j < colRange.end; ++j) {matC.at<float>(i, j) = matA.at<float>(i, j) + matB.at<float>(i, j);}});}});// 显示结果(省略部分代码)return 0;
}

在这个示例中,我们首先使用外层的 cv::parallel_for_ 来处理行循环,然后在内层使用另一个 cv::parallel_for_ 来处理列循环。通过将内层循环划分成更小的任务单元,可以充分利用多核处理器并加速处理。

需要注意的是,并行处理的粒度要适当,避免过细的任务划分造成额外的线程开销。根据实际情况进行权衡和调整,以达到最佳的性能提升。

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

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

相关文章

刷算法常见注意点

num 正无穷&#xff1a;Infinity 金额格式化&#xff1a;利用字符串提供的toLocaleString()方法处理。有时候不生效&#xff0c;比如app 数字容错&#xff1a;if(!Number.isFinite(num)){ //不是数字} js数组 头部添加unshift 、尾部增加push、首部删除shift、尾部删除pop…

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图) 目录 时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 时序预测 | MATLAB实现ELM极

最大子数组和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;6 解…

前端-初始化Vue3+TypeScript

如果使用如下命令初始化项目&#xff0c;项目很干净&#xff0c;很适合了解项目的各个结构。 npm init vitelatest如果使用如下命令初始化项目&#xff0c;是可以选择你需要的组件 npm init vuelatest

vue根据template结构自动生成css/scss/less样式嵌套

vscode搜索安装插件&#xff1a;AutoScssStruct4Vue

十、接口(3)

本章概要 接口适配接口字段 初始化接口中的字段 接口嵌套接口和工厂方法模式 接口适配 接口最吸引人的原因之一是相同的接口可以有多个实现。在简单情况下体现在一个方法接受接口作为参数&#xff0c;该接口的实现和传递对象则取决于方法的使用者。 因此&#xff0c;接口的…

Linux 系统的如何优化(面试题)

Linux 系统的如何优化&#xff08;面试题&#xff09; (1) 禁用不需要的服务 ntsysv 命令最为方便&#xff0c;执行后&#xff0c;把不需要的勾选去掉就行 &#xff08;2&#xff09;避免直接使用root用户&#xff0c;普遍用户通过sudo授权操作 &#xff08;3&#xff09;通过…

wustojc日期格式变化

#include <stdio.h> int main() {char a[10];for(int i0;i<10;i){//用一个耍聪明的方法&#xff0c;全部用数组存储&#xff1b;面向结果编程a[0]getchar();}printf("%c%c%c%c%c%c%c%c%c%c",a[6],a[7],a[8],a[9],a[2],a[0],a[1],a[5],a[3],a[4]);return 0;}…

数据结构:栈和队列

文章目录 一、栈1.栈的概念及结构1.栈的概念及结构2.栈的实现 2.栈的顺序表实现1.栈的结构体和实现的功能函数2.栈的初始化&#xff0c;入栈和出栈操作3.栈的其他操作 3.栈的链表实现1.栈的结构体和实现的功能函数2.栈功能函数的实现 二、队列1.队列的概念及结构1.队列的概念及…

【使用教程】在Ubuntu下运行CANopen通信PMM伺服电机使用教程(NimServoSDK_V2.0.0)

本教程将指导您在Ubuntu操作系统下使用NimServoSDK_V2.0.0来运行CANopen通信的PMM系列一体化伺服电机。我们将介绍必要的步骤和命令&#xff0c;以确保您能够成功地配置和控制PMM系列一体化伺服电机。 NimServoSDK_V2.0.0是一款用于PMM一体化伺服电机的软件开发工具包。它提供了…

每日一学——交换机

交换机是一种网络设备&#xff0c;用于连接多台计算机和其他网络设备&#xff0c;以实现数据的交换和传输。它通过将数据包在不同端口之间转发&#xff0c;将数据从一个设备发送到目标设备。交换机可以提供高速、可靠和安全的局域网连接。 交换机的工作原理是根据目标MAC地址来…

Harmony OS教程学习笔记

基础知识 1.如何修改程序启动的第一个页面&#xff1f; 不想使用创建的默认的页面&#xff0c;这时需要修改启动页面&#xff0c;修改的地方在EntryAbility文件中的onWindowStageCreate方法中。 onWindowStageCreate(windowStage: window.WindowStage) {// Main window is cr…

【爬虫】Urllib让我们的 python 假装是浏览器

在 Python 这个内置的 Urllib 库中&#xff0c;有这么 4 个模块&#xff1a; request&#xff0c;request模块是我们用的比较多的&#xff0c;就是用它来发起请求&#xff0c;所以我们重点说说这个模块。error&#xff0c;error模块呢&#xff0c;就是当我们在使用 request 模…

Golang Gorm 更新字段 save update updates

更新和删除操作的前提条件都是要在找到数据的情况下&#xff0c;先要查询到数据才可以做操作。 更新的前提的先查询到记录&#xff0c;Save保存所有字段&#xff0c;用于单个记录的全字段更新它会保控所有字段&#xff0c;即使零值也会保存。 在更新和删除之前&#xff0c;要利…

远程线程注入(简单样例以及原理)

远程线程注入(简单样例以及原理) 注入的目标是将我们的代码注入到目标进程的地址空间中 注入通常可以根据注入的内容分为两种类型&#xff1a; shellcode注入 &#xff1a;这种注入是将我们的代码直接注入到目标内存中&#xff0c;这就要保证我们的代码在贴到其他地址上后仍…

交叉熵--损失函数

目录 交叉熵&#xff08;Cross Entropy&#xff09; 【预备知识】 【信息量】 【信息熵】 【相对熵】 【交叉熵】 交叉熵&#xff08;Cross Entropy&#xff09; 是Shannon信息论中一个重要概念&#xff0c; 主要用于度量两个概率分布间的差异性信息。 语言模型的性能…

Azure静态网站托管

什么是静态网站托管 Azure Blob的静态网站托管是一项功能&#xff0c;它允许开发人员在Azure Blob存储中托管和发布静态网站。通过这个功能&#xff0c;您可以轻松地将静态网页、图像、视频和其他网站资源存储在Azure Blob中&#xff0c;并直接通过提供的URL访问这些资源。 官…

使用VisualStudio制作上位机(一)

文章目录 使用VisualStudio制作上位机(一)写在前面第一部分:创建应用程序第二部分:GUI主界面设计使用VisualStudio制作上位机(一) Author:YAL 写在前面 1.达到什么目的呢 本文主要讲怎么通过Visual Studio 制作上位机,全文会以制作过程来介绍怎么做,不会去讲解具体…

css 实现svg动态图标效果

效果演示&#xff1a; 实现思路&#xff1a;主要是通过css的stroke相关属性来设置实现的。 html代码: <svgt"1692441666814"class"icon"viewBox"0 0 1024 1024"version"1.1"xmlns"http://www.w3.org/2000/svg"p-id"…

操作符详解(1)

1. 操作符分类&#xff1a; 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 1. 除了 % 操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。 2. 对…