首页 > 系统相关 >opencv加载内存中图片

opencv加载内存中图片

时间:2023-08-22 14:48:33浏览次数:32  
标签:buff pic jpg opencv 内存 file size cv 加载

        opencv从磁盘加载一张图片非常简单,通过cv::imread即可,代码如下:

 
  cv::Mat src_mat = cv::imread("1.jpg"); //读取图片1.jpg,imread会将图片内容解码成yuv或rgb存放到Mat对象   cv::Mat dst_mat = src_mat(cv::Rect(100, 100, 1600, 900)); //获取图片固定区域的内容   std::vector<uchar> jpg_buff;   bool ret = cv::imencode(".jpg", dst_mat, jpg_buff);//对固定区域的内容重新进行jpg编码,生成jpg图片,存入jpg_buff   FILE *file = fopen("2.jpg", "wb");   if (file != nullptr) {   fwrite(jpg_buff.data(), 1, jpg_buff.size(), file); //将jpg图片写入内存   fclose(file);   }
 
 

        然而,很多情况,程序需要从内存中加载图片,例如通过网络上传的图片。很显然,这样的图片不能写入磁盘,然后再通过cv::imread读取,效率太低了。因此,需要从内存直接加载。然后通过cv::imdecode将图片解码成cv::Mat,代码如下:

 
  FILE *file = fopen("1.jpg", "rb");   uchar *mem_pic = nullptr;   long size = 0;   if (file != nullptr) {   fseek(file, 0, SEEK_END);   size = ftell(file);   fseek(file, 0, SEEK_SET);   mem_pic = new uchar[size];   fread(mem_pic, 1, size, file);   fclose(file);   }       cv::_InputArray pic_arr(mem_pic, size);   cv::Mat src_mat = cv::imdecode(pic_arr, CV_LOAD_IMAGE_COLOR);   cv::Mat dst_src = src_mat(cv::Rect(100, 100, 1600, 900));   std::vector<uchar> pic_buff;   bool ret = cv::imencode(".jpg", dst_src, pic_buff);   file = fopen("3.jpg", "wb");   if (file != nullptr) {   fwrite(pic_buff.data(), 1, pic_buff.size(), file);   fclose(file);   }
 
 

        cv::_Array还可以使用std::vector代替,代码如下:

 
  FILE *file = fopen("1.jpg", "rb");   uchar *mem_pic = nullptr;   long size = 0;   if (file != nullptr) {   fseek(file, 0, SEEK_END);   size = ftell(file);   fseek(file, 0, SEEK_SET);   mem_pic = new uchar[size];   fread(mem_pic, 1, size, file);   fclose(file);   }       //cv::_InputArray pic_arr(mem_pic, size);   std::vector<uchar> pic_vec(mem_pic, mem_pic + size);   cv::Mat src_mat = cv::imdecode(pic_vec, CV_LOAD_IMAGE_COLOR);   cv::Mat dst_src = src_mat(cv::Rect(200, 200, 400, 225));   std::vector<uchar> pic_buff;   bool ret = cv::imencode(".jpg", dst_src, pic_buff);   file = fopen("3.jpg", "wb");   if (file != nullptr) {   fwrite(pic_buff.data(), 1, pic_buff.size(), file);   fclose(file);   }
 
 

 

 

标签:buff,pic,jpg,opencv,内存,file,size,cv,加载
From: https://www.cnblogs.com/lidabo/p/17648477.html

相关文章

  • OpenCV 读取内存图片
    方法一(适用于OpenCV3):     #include<opencv2/opencv.hpp> #include<opencv2/imgproc/imgproc_c.h> #include<iostream>   char*lpFileBuf=GetFileBuf("girl.bmp");   CvMatmCvm......
  • 爬虫异常处理:应对验证和动态加载数据的方法
    作为一名专业的爬虫代理程序员,在爬取数据的过程中,我经常遇到验证和动态加载数据异常的问题。今天,我就和大家分享一些关于如何处理这两种异常情况的实用技巧。不论你是在爬取网站数据还是获取动态加载的内容,这些技巧都能帮助你更好地应对问题,让你的爬虫顺利运行。挑战一:验证机制很多......
  • Lnton羚通云算力平台OpenCV Python颜色空间转换与抠图教程
    在OpenCVPython中,颜色空间转换和图像抠图是常见的图像处理任务。下面我将为你介绍如何进行颜色空间转换和图像抠图。颜色空间转换:在OpenCVPython中,可以使用 cv2.cvtColor() 函数将图像从一个颜色空间转换为另一个颜色空间。常用的颜色空间转换包括RGB、BGR、灰度(GRAY)、HS......
  • Redis系列19:LRU内存淘汰算法分析
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • 查看cpu或内存占用最多的进程
    通过ps命令查找,并对指定参数进行排序,然后取前10命令如下:ps-aux|sort-k3nr|head-10或者ps-aux|sort-k4nr|head-10ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可......
  • Windows 使用vscode 下载编译opencv
    1.下载opencv源码.下载地址:https://opencv.org/releases/2.下载mingw这里的安装版本需要注意下,需要安装posix线程版本,不然opencv编译的时候会报错x86_64-12.2.0-release-posix-seh-rt_v10-rev1解压后配置环境变量就行下载地址如下:https://github.com/niXman/mingw-builds-b......
  • HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制LazyForEach数据懒加载
    LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当LazyForEach在滚动容器中使用了,框架会根据滚动容器可视区域按需创建组件,当组件划出可视区域外时,框架会进行组件销毁回收以降低内存占用。一、接口描述LazyForEach(dataSource:IDataSource,......
  • HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制LazyForEach数据懒加载
    LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当LazyForEach在滚动容器中使用了,框架会根据滚动容器可视区域按需创建组件,当组件划出可视区域外时,框架会进行组件销毁回收以降低内存占用。一、接口描述LazyForEach(dataSource:IDataSource,......
  • Lnton羚通云算力平台如何在OpenCV-Python 中,来进行图像算术运算?
    在OpenCV-Python中,可以使用函数cv2.add()、cv2.subtract()、cv2.multiply()和cv2.divide()来进行图像算术运算。这些函数接受两个输入图像,并对其进行逐像素的运算。1.图像加法:OpenCV 是饱和运算(大于255算255),NumPy 是模运算(大于255会与256进行求模)。importnumpyasnpimpo......
  • 使用Pytorch和OpenCV实现视频人脸替换
    DeepFaceLab”项目已经发布了很长时间了,作为研究的目的,本文将介绍他的原理,并使用Pytorch和OpenCV创建一个简化版本。本文将分成3个部分,第一部分从两个视频中提取人脸并构建标准人脸数据集。第二部分使用数据集与神经网络一起学习如何在潜在空间中表示人脸,并从该表示中重建人脸图......