opencv 打开图片后,cv::mat存入共享内存的代码,以及如何设置共享内存的大小?图片的3840x2160 pixels

opencv 打开图片后,cv::mat存入共享内存的代码,以及如何设置共享内存的大小?图片的3840x2160 pixels。
在OpenCV中,将cv::Mat对象存入共享内存需要几个步骤。首先,你需要创建一个共享内存区域,然后将cv::Mat的数据复制到该区域。下面是一个简单的示例代码,展示了如何实现这一过程:

  • 创建共享内存区域:你可以使用POSIX共享内存(shm_open和mmap)或System V共享内存(shmget和shmat)来创建共享内存区域。这里我们使用POSIX共享内存作为例子。
  • 设置共享内存的大小:共享内存的大小应该至少与cv::Mat的数据部分一样大。对于彩色图像,每个像素通常由多个字节表示(例如,对于BGR图像,每个像素有3个字节)。此外,还需要考虑图像的行对齐(stride)问题。OpenCV的cv::Mat对象可能包含额外的填充字节以确保每行的起始地址对齐。

下面是一个简单的代码示例:

#include <opencv2/opencv.hpp>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>int main() {// 读取图片cv::Mat image = cv::imread("path_to_your_image.jpg", cv::IMREAD_COLOR);if (image.empty()) {std::cerr << "无法打开图片" << std::endl;return -1;}// 计算共享内存的大小// 对于BGR图像,每个像素3个字节,加上可能的行对齐填充size_t shmSize = image.total() * image.elemSize() + getpagesize() - 1;shmSize -= shmSize % getpagesize(); // 确保大小是页面大小的整数倍// 创建共享内存对象int shmFd = shm_open("/my_shared_memory", O_CREAT | O_RDWR, 0666);if (shmFd == -1) {perror("shm_open");return -1;}// 设置共享内存的大小if (ftruncate(shmFd, shmSize) == -1) {perror("ftruncate");return -1;}// 将共享内存映射到进程的地址空间void* shmPtr = mmap(nullptr, shmSize, PROT_READ | PROT_WRITE, MAP_SHARED, shmFd, 0);if (shmPtr == MAP_FAILED) {perror("mmap");return -1;}// 将cv::Mat的数据复制到共享内存memcpy(shmPtr, image.data, image.total() * image.elemSize());// ... 在这里,你可以让其他进程访问共享内存中的图像数据 ...// 清理资源munmap(shmPtr, shmSize);close(shmFd);shm_unlink("/my_shared_memory");return 0;
}

注意:

上述代码仅作为示例,可能需要根据你的具体需求进行调整。
共享内存的使用需要谨慎处理同步和互斥问题,以避免数据竞争和不一致。你可能需要使用锁或其他同步机制来确保多个进程安全地访问共享内存。
在使用共享内存时,还需要考虑权限和安全性问题。确保只有授权的进程可以访问共享内存,并遵循最小权限原则。

为何不用read() 用memcpy()?

在涉及共享内存时,使用 memcpy() 而不是 read() 的主要原因在于共享内存的特性。共享内存允许两个或多个进程直接访问同一块物理内存,而不需要通过内核或其他中间层进行数据的复制或传递。

直接访问:由于共享内存是直接映射到每个进程的地址空间的,因此进程可以像访问本地内存一样直接访问它。这意味着进程可以直接读取和写入共享内存,而不需要通过系统调用(如 read() 或 write())来间接操作。
效率:使用 memcpy() 直接在进程的地址空间内复制数据通常比使用 read() 或 write() 进行系统调用要快得多。系统调用涉及内核与用户空间之间的上下文切换,这通常是一个相对昂贵的操作。因此,对于需要频繁访问共享内存的场景,使用 memcpy() 可以显著提高性能。
语义差异:read() 通常用于从文件描述符(如文件、管道或套接字)中读取数据,而共享内存不是文件描述符。因此,从语义上讲,使用 memcpy() 来复制共享内存中的数据更为合适。
同步问题:当多个进程同时访问共享内存时,需要考虑同步问题以避免数据竞争和不一致。使用 memcpy() 并不会解决同步问题,但你可以结合其他同步机制(如互斥锁、信号量或原子操作)来确保对共享内存的访问是安全的。

总之,使用 memcpy() 而不是 read() 来访问共享内存是因为共享内存允许直接访问,使用 memcpy() 可以提高性能,并且从语义上讲更为合适。然而,这并不意味着 read() 在所有情况下都不能用于共享内存;在某些特定的上下文中,它可能仍然是有用的。但在大多数情况下,当涉及到共享内存时,你会更倾向于使用 memcpy() 或其他类似的内存操作函数。

为何cv::mat的内存比图片本身大很多?图片只有1.5M,但是内存有25M

cv::Mat对象在内存中占用的空间可能比图片文件本身大很多,这通常是由以下几个原因造成的:

数据格式和编码:图片文件在存储时,通常会使用某种形式的压缩,例如JPEG、PNG等。这些压缩格式可以有效地减小文件大小,但解压后的原始图像数据会占用更多的内存空间。cv::Mat存储的是解压后的原始图像数据,因此其内存占用会大于压缩后的文件大小。

通道和深度:图像的每个像素可能由多个通道组成(如RGB图像的三个通道),每个通道可能使用不同的数据深度(如8位无符号整数、16位有符号整数、32位浮点数等)。通道数量和深度的增加都会导致内存占用的增加。

行对齐:cv::Mat为了优化内存访问速度,可能会在每行的末尾添加额外的填充字节,以确保每行的起始地址都是某个固定大小的整数倍(通常是16字节或32字节)。这种行对齐会增加内存占用,但可以提高内存访问的效率。

附加信息和元数据:除了图像数据本身外,cv::Mat还可能存储一些附加信息和元数据,如图像的尺寸、类型、步长等。这些信息虽然不直接表示图像内容,但也会占用一定的内存空间。

内存分配机制:在某些情况下,内存分配器可能会为cv::Mat分配比实际所需稍大的内存块,以减少频繁分配和释放小块内存的开销。这也会导致观察到的内存占用大于预期。

因此,即使图片文件本身只有1.5M,cv::Mat对象在内存中占用25M也是可能的。这并不意味着有内存浪费,而是反映了原始图像数据在内存中的实际占用情况。如果需要减小内存占用,可以考虑使用更小的数据类型、减少通道数量或采用其他优化方法。然而,这些优化可能会影响到图像的质量和处理能力。

另外一个进程显示

#include <opencv2/opencv.hpp>
#include <sys/mman.h> // 对于共享内存映射
#include <fcntl.h>    // 对于文件控制操作
#include <unistd.h>   // 对于unistd系统调用
#include <cstring>    // 对于memcpy// 假设你已经有了共享内存的标识符(例如,通过shm_open或ftruncate创建)
int shm_fd = ...; // 共享内存的文件描述符// 假设你已经知道了图片的尺寸和类型
int width = ...;
int height = ...;
int channels = ...; // 例如,对于BGR图片,channels是3
int type = CV_8UC3; // 假设是8位无符号字符的3通道BGR图片// 计算共享内存的大小
size_t shmSize = width * height * channels * sizeof(uchar);// 将共享内存映射到当前进程的地址空间
uchar* sharedMemoryData = static_cast<uchar*>(mmap(nullptr, shmSize, PROT_READ, MAP_SHARED, shm_fd, 0));
if (sharedMemoryData == MAP_FAILED) {perror("mmap");// 错误处理...
}// 创建cv::Mat对象来包装共享内存中的数据
cv::Mat image(height, width, type, sharedMemoryData);// 显示图片
cv::imshow("Stitching Image", image);
cv::waitKey(0); // 等待按键,0表示无限等待// 在不再需要时,解除映射
if (munmap(sharedMemoryData, shmSize) == -1) {perror("munmap");// 错误处理...
}// 关闭共享内存的文件描述符
close(shm_fd);

个人实践

https://gitee.com/hiyanyx/share-memory-mmap-opencv

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

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

相关文章

DashText-进阶使用

前置知识 BM25简介 BM25算法&#xff08;Best Matching 25&#xff09;是一种广泛用于信息检索领域的排名函数&#xff0c;用于在给定查询&#xff08;Query&#xff09;时对一组文档&#xff08;Document&#xff09;进行评分和排序。BM25在计算Query和Document之间的相似度…

好文!12个策略解决 Kafka 数据丢失问题

哥们儿&#xff01;有遇到Kafka数据丢失问题的问题吗&#xff0c;你是如何解决的&#xff1f;今天的文章&#xff0c;V哥来详细解释一下&#xff0c;整理了12种解决策略&#xff0c;希望可以帮助你解决项目中的问题&#xff1a;以下是一些常见的解决方案和最佳实践。 生产者确认…

四川赤橙宏海商务信息咨询有限公司正规吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。作为这一潮流的佼佼者&#xff0c;抖音电商以其独特的短视频直播模式&#xff0c;吸引了大量消费者和商家的目光。在这一背景下&#xff0c;四川赤橙宏海商务信息咨询有限公司应运而生&#xff0c;…

2Y0A21 GP2Y0A21YK0F 红外测距传感器 arduino使用教程

三根线 正极负极信号线 确认自己的三根线分别代表什么&#xff0c;我们的颜色可能不一样 附一张我买的传感器他们的说明图 正极 接 开发板5V 负极 接开发板GND 信号线 接A0 代码arduino ide上面写 // Infračerven senzor vzdlenosti Sharp 2Y0A21// připojen potře…

2024最新AI大模型-LLm八股合集(三)

常见的大模型 1.ChatGLM 1.1 背景 主流的预训练框架主要有三种&#xff1a; autoregressive自回归模型&#xff08;AR模型&#xff09; &#xff1a;代表作GPT。本质上是一个left-to-right的语言模型。 通常用于生成式任务 &#xff0c;在长文本生成方面取得了巨大的成功…

【x264】整体框架汇总

【x264】整体框架汇总 1. x264整体框架图2. 思考 参考&#xff1a; x264源代码简单分析&#xff1a;概述 参数分析&#xff1a; 【x264】x264编码器参数配置 流程分析&#xff1a; 【x264】x264编码主流程简单分析 【x264】编码核心函数&#xff08;x264_encoder_encode&…

空气流量和空气压力参数解耦系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 空气流量和空气压力参数解耦系统simulink建模与仿真&#xff0c;在许多系统中&#xff0c;空气流量&#xff08;Q&#xff09;和压力&#xff08;P&#xff09;之间存在耦合关…

SpringBoot + thymeleaf 修改文件,刷新页面不能实时展示修改后的内容问题解决

修改页面后文件后&#xff0c;刷新页面&#xff0c;内容不变&#xff0c;是因为项目没有编译&#xff0c;没有将新的页面文件编译&#xff0c;以下方法可以完美解决次问题 具体内容请查看&#xff1a;http://www.haozgx.top/blog/article/2

注解详解系列 - @Transactional

注解简介 在今天的每日一注解中&#xff0c;我们将探讨Transactional注解。Transactional是Spring框架中的一个注解&#xff0c;用于管理事务&#xff0c;以确保操作的原子性、一致性、隔离性和持久性&#xff08;ACID属性&#xff09;。 注解定义 Transactional注解用于声明…

vue element-ui 车牌号选择组件

实现效果 carnumber.vue <template><div class"car_no_popover"><div class"row_div"><div class"every_div" v-for"item in area"><button click"selectCarNo(item)">{{ item }}</butto…

绿色免费离线版JS加密混淆工具 - 支持全景VR加密, 小程序js加密, H5网站加密

自从我们推出在线版的免费JS加密混淆工具以来&#xff0c;受到了广大用户的热烈欢迎。特别是全景开发人员&#xff0c;他们使用该工具加密VR插件的JS代码, 添加域名锁等&#xff0c;都非常有效地保护了插件的代码资源。 最近&#xff0c;我们收到了许多用户的反馈&#xff0c;…

Android WindowFeature小探究

主Activity&#xff0c;用来提供文字信息和输入效果ID&#xff1a; package com.zms.windowfeature; import org.xml.sax.Parser; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.v…

【代码随想录算法训练营第四十一天|1049.最后一块石头的重量II、494.目标和、474.一和零】

文章目录 1049.最后一块石头的重量II494.目标和474.一和零 1049.最后一块石头的重量II 稍微数学退一下就可以看出实际上还是把数组分成两个部分&#xff0c;去求两个子集的差值的最小值&#xff0c;和昨天最后一题是一样的。 class Solution:def lastStoneWeightII(self, sto…

Cloneable接口和对象的克隆——浅拷贝和深拷贝

用Clonable接口实现对象的克隆——浅拷贝和深拷贝 1. 浅拷贝2. 深拷贝 在Object类中提供了clone方法&#xff0c;用来是实现对象的克隆&#xff01; 1. 浅拷贝 我们首先来尝试用clone方法去克隆一个Person对象 public class Person {public String name;public int age;publi…

Perforce静态代码分析专家解读MISRA C++:2023®新标准:如何安全、高效地使用基于范围的for循环,防范未定义行为

MISRA C&#xff1a;2023——MISRA C 标准的下一个版本来了&#xff01;为了帮助您了解 MISRA C&#xff1a;2023相比于之前版本的变化&#xff0c;我们将继续为您带来Perforce首席技术支持工程师Frank van den Beuken博士的博客系列&#xff0c;本期为第三篇。 在前两篇系列文…

【NLP基础知识】有哪些相似度计算方式(持续更新)

相异性/相似性的计算-zine 相似度计算方式 1. Euclidean Distance (L2) 用途&#xff1a;主要用于计算机视觉领域。 解释&#xff1a;计算两个点之间的直线距离。假设有两个向量 a [ a 1 , a 2 , . . . , a n ] \mathbf{a} [a_1, a_2, ..., a_n] a[a1​,a2​,...,an​] …

企业为何需要搭建线上虚拟品牌展厅?

在数字化时代&#xff0c;线上虚拟品牌展厅已成为企业不可或缺的一部分。以下是构建线上虚拟品牌展厅的4大关键理由&#xff1a; 1、迎合在线购物趋势 随着移动互联网的飞速发展和普及&#xff0c;消费者越来越倾向于在线购物。一个线上虚拟品牌展厅能够完美地满足这一需求&am…

数据分析必备:一步步教你如何用matplotlib做数据可视化(5)

1、Matplotlib Multiplots 在本章中&#xff0c;我们将学习如何在同一画布上创建多个子图。 subplot()函数返回给定网格位置的axes对象。此函数的签名是 plt.subplot(subplot(nrows, ncols, index)在当前图中&#xff0c;该函数创建并返回一个Axes对象&#xff0c;在ncolsaxe…

VScode如何调试

调试 1.打断点 1.点击调试按钮 3.点击下拉选择环境node&#xff0c;点击绿三角选择输入调试的命令&#xff08;具体命令查看package.json中scripts中的哪一个命令和运行的文件&#xff09;&#xff0c;点击右边的设置&#xff08;可以直接跳下面第八步&#xff01;&#xff…

EOS Black灵魂回响黑色账号注册 EOS Black怎么注册账号教程

又一款新的MMORPG游戏即将上线&#xff0c;游戏名称叫做《灵魂回响&#xff1a;黑色》&#xff0c;游戏继承了《灵魂回响》系列的基本世界观和背景故事&#xff0c;从危险中救出来的阿尔卡纳们沉醉于权力开始堕落, 少数阿尔卡纳还没有忘记自己的本分,为净化世界而努力&#xff…