win下编译opencv+libjpeg-turbo

news2024/10/6 5:32:09

文章目录

  • 前言
  • 编译环境
  • 下载opencv和jpeg-turbo源码
  • 编译jpeg-turbo
  • 编译opencv
  • 失败?那就直接调用jpeg-turbo库进行编解码

前言

opencv默认自带第三方jpeg编解码库,但其性能一般,对高性能需求的程序来说是不适合的,因此我们可以把jpeg-turbo编译进opencv里,这样opencv编解码就调用的是jpeg-turbo库了。

编解码效率对比:(尺寸3000*3000的图片)

-编码解码
opencv292ms124ms
jpeg-turbo68ms80ms

编译环境


系统:win10 x64
编译器:visual studio 2015
make工具:cmake 3.15.0
opencv:3.4.0
jpeg-turbo:libjpeg-turbo-master

下载opencv和jpeg-turbo源码


opencv:https://opencv.org/releases/page/5/
jpeg-turbo:https://gitcode.net/mirrors/libjpeg-turbo/libjpeg-turbo

编译jpeg-turbo

下载jepg-turbo源码并解压后得到libjpeg-turbo-master文件夹,在libjpeg-turbo-master根目录创建用于构建的目录build_turbo,打开cmake,填写信息如图所示:
在这里插入图片描述
点击finish后,会执行第一次Configuring,Configuring完后勾选WITH_JPEG8选项,CMAKE_INSTALL_PREFIX表示用编译器编译INSTALL的时候将库文件和头文件打包的目录。
在这里插入图片描述
再分别点击Configure和Generate按钮。此时构建好了,然后vs2015打开.sln文件,右键ALL_BUILD点击生成,生成成功后再右键INSTALL点击生成,成功后上面CMAKE_INSTALL_PREFIX指定的目录应该就有文件了(比如我生成的路径是:C:\libjpeg-turbo64),分别编译Debug和Release版本。(注意:INSTALL会覆盖上一次编译的lib和dll目录,每次INSTALL后最好新建Debug或Release目录把lib和dll文件夹放进去)

编译opencv

同理,在根目录新建build目录,同上配置cmake后执行第一次Configue,执行成功后如图所示:
在这里插入图片描述
接下来,点击右上角Add Entry按钮,添加JPEG_INCLUDE_DIR字段,type为PATH,Value为我们编译好的jpeg-turbo库头文件路径,然后点击OK,如图所示:
在这里插入图片描述
再点击Add Entry按钮,添加JPEG_LIBRARY字段,type为FILEPATH,Value为turbojpeg-static.lib静态库文件路径(包含文件名),然后点击OK,如图所示:
在这里插入图片描述
添加后如图所示:
在这里插入图片描述
BUILD_JPEG字段勾选去掉,这一步是让其不要构建自带的jpeg库,而用我们添加的jpeg-turbo库。
WITH_JPEG字段是默认勾选上的,如果没有,请勾选上。
BUILD_opencv_world字段勾选后最后会集中编译成一个opencv_world340.dll库,方便调用。

此时都配好了,再次点击Configure,Configure完后点击Generate生成.sln文件,然后用vs打开工程,右键BUILD_ALL点击生成。接下来就是漫长的编译过程了,编译完后,再右键INSTALL生成。

失败?那就直接调用jpeg-turbo库进行编解码

下面给出封装好的编解码函数和调用方法,工程中导入头文件和库就不阐述了。

/*编码*/
void tj_compress_jpeg_to_mem(
	/*IN*/BYTE *src, int width, int height, int pixelFormat, int subsamp, int quality, int flags,
	/*OUT*/BYTE **dst, unsigned long *dstLen
)
{
	tjhandle handle = tjInitCompress();
	tjCompress2(
		handle, src, width, 0/*pitch*/, height, pixelFormat,
		dst, dstLen, subsamp, quality, flags
	);
	tjDestroy(handle);
}

/*解码*/
void tj_decompress_jpeg_from_mem(
	/*IN*/BYTE *src, unsigned long srcLen, int tjPixelFormat, int flags,
	/*OUT*/BYTE **dst, unsigned long *dstLen, int *width, int *height, int *jpegSubsamp, int *jpegColorspace)
{
	tjhandle handle = tjInitDecompress();
	tjDecompressHeader3(handle, src, srcLen, width, height, jpegSubsamp, jpegColorspace);

	int components = tjPixelSize[(TJPF)tjPixelFormat]; // 1 for GRAY,3 for RGB
	(*dstLen) = (*width) * (*height) * components;

	BYTE *tmp_dst = tjAlloc(*dstLen); 
	tjDecompress2(
		handle, src, srcLen,
		tmp_dst, *width, 0/*pitch*/, *height, tjPixelFormat, flags
	);
	tjDestroy(handle);
	(*dst) = tmp_dst;
}

调用方法:

//编码
cv::Mat mt= cv::imread("test.jpg");//默认三通道
BYTE* dst = NULL;
unsigned long dstLen = 0;
tj_compress_jpeg_to_mem(pic.data, pic.cols, pic.rows, TJPF::TJPF_BGR, TJSAMP::TJSAMP_411, 95, TJFLAG_FASTDCT, &dst, &dstLen);

//解码
BYTE *src = NULL;
unsigned long srcLen;
int w, h, jpegSubsamp, jpegColorspace;
tj_decompress_jpeg_from_mem(dst,dstLen,TJPF::TJPF_BGR, TJFLAG_FASTDCT,&src,&srcLen,&w,&h,&jpegSubsamp, &jpegColorspace);
cv::Mat mt2 = cv::Mat(h, w, CV_8UC3);
memcpy(mt2.data, src, srcLen);
tjFree(dst);
tjFree(src);

如果是灰度图,TJPF::TJPF_BGR改成TJPF::TJPF_GRAY, TJSAMP::TJSAMP_411改成TJSAMP_GRAY

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

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

相关文章

设计模式学习(八):Proxy代理模式

一、什么是Proxy模式 Proxy是“代理人”的意思,它指的是代替别人进行工作的人。当不一定需要本人亲自进行工作时,就可以寻找代理人去完成工作。但代理人毕竟只是代理人,能代替本人做的事情终究是有限的。因此,当代理人遇到无法自己…

文件上传oss,并查询上传进度(SpringBoot+Redis+Oss+Swagger3)

文章目录诉求技术选型pom配置项目结构文件树图示结构代码实现配置相关配置文件yamlSwagger3配置跨域问题配置oss相关ServiceControllerApplicationSwagger接口操作获取上传文件标识号获取文件上传进度小结诉求 将文件上传到oss,并实时监听上传进度,并将进…

【javaSE】中基本类型和引用类型对象的比较及PriorityQueue中的比较方法

写博客是为了提升自己,也是为了展现自己的学习成果,坚持!坚持!坚持!未来是什么样的,闯一闯就知道啦。喜欢就留个关注吧!!! 目录 一、java对象的比较 1.1java中基本类型的比较 1.2引用对象的比较 1.3引用…

使用云端的GPU进行yolov5的训练

前言本文介绍了使用云端GPU进行yolov5训练环境配置的过程一、创建实例这里使用的是恒源云的GPU服务器,官方网址为恒源云_GPUSHARE-恒源智享云他的用户文档为Tmux - 恒源云用户文档一般的问题在用户文档中都可以找到解决办法。注册并登录后的界面如下图所示。点击云市…

c++11 标准模板(STL)(std::forward_list)(十)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

UPerNet:Unified Perceptual Parsing for Scene Understanding论文解读

Unified Perceptual Parsing for Scene Understanding 论文&#xff1a;[1807.10221] Unified Perceptual Parsing for Scene Understanding (arxiv.org) 代码&#xff1a;CSAILVision/unifiedparsing: Codebase and pretrained models for ECCV’18 Unified Perceptual Parsi…

第二章.线性回归以及非线性回归—岭回归

第二章.线性回归以及非线性回归 2.12 岭回归&#xff08;Ridge Regression&#xff09; 1.前期导入&#xff1a; 1).标准方程法[w(XTX)-1XTy]存在的缺陷&#xff1a; 如果数据的特征比样本点还多&#xff0c;数据特征n&#xff0c;样本个数m&#xff0c;如如果n>m&#xf…

5种气血不足的面相

我们常用“气色好”形容人良好的健康状态&#xff0c;反之&#xff0c;气血不足就是不健康的表现。想知道自己是否气血不足&#xff0c;可以从以下几种表现中判断。眼白黄&#xff1a;所谓人老珠黄&#xff0c;就是指眼白的颜色变得浑浊、发黄、有血丝&#xff0c;很可能气血不…

网络编程基础(1)

1 OSI七层模型&#xff08;理论&#xff09; 七层模型&#xff0c;亦称OSI&#xff08;Open System Interconnection&#xff09;。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一般称为OSI参考模型或七层…

cycle_gan使用教程

junyanz/pytorch-CycleGAN-and-pix2pix: Image-to-Image Translation in PyTorch (github.com) 如果是用cycle_gan 数据集 /数据集文件夹名&#xff0c;下面四个子文件名 testA testB trainA trainB trainA是A风格图片&#xff0c;trainB是B风格图片。 训练参数 test…

CCF BDCI | 算能赛题决赛选手说明论文-04

基于TPU平台实现人群密度估计 队名&#xff1a;innovation 陈照照 数据科学与大数据技术20级 台州学院 中国-瑞安 479253198qq.com董昊数据科学与大数据技术20级 台州学院 中国-杭州 donghaowifi163.com陈晓聪数据科学与大数据技术20级 台州学院 中国-宁波 2637491…

Golang -- openwechat微信发送消息、自动回复

开篇 马上就要到农历新年了&#xff0c;不妨写一段代码准时为好友们送上祝福。 该 Demo 使用开源项目 openwechat &#xff0c;实现获取好友列表、为好友发送消息、图片或文件&#xff0c;接收来自好友或群组的消息并设置自动回复等功能。 openwechat Github地址 openwechat 文…

管道(匿名,有名)

文章目录Linux 进程间通信的方式管道匿名管道有名管道Linux 进程间通信的方式 管道 管道特点 管道其实是一个在内核内存中维护的缓冲器&#xff0c;这个缓冲器的存储能力是有限的&#xff0c;不同的操作系统大小不一定相同管道拥有文件的特质&#xff1a;读操作、写操作 匿名管…

线扫相机DALSA-变行高拍照

CamExpert在线阵模式中默认的Buffer设置是Fixed Length。在这种设置下&#xff0c;在一帧采集结束前所接收到的新的帧触发信号都会被忽略。在有的应用中&#xff0c;需要新一帧的外触发信号能够中断当前帧的采集&#xff0c;开始新的一帧。这需要将Buffer设为Variable Length。…

【云原生】k8s之HPA,命名空间资源限制

内容预知 1.HPA的相关知识 2.HPA的部署运用 2.1 进行HPA的部署设置 2.2 HPA伸缩的测试演示 &#xff08;1&#xff09;创建一个用于测试的pod资源 (2)创建HPA控制器&#xff0c;进行资源的限制&#xff0c;伸缩管理 &#xff08;3&#xff09;进入其中一个pod容器仲&#xf…

Redhat OpenStack使用命令行发放云主机

OpenStack中各大组件的作用Glance&#xff1a;负责管理镜像&#xff08;镜像的上传、删除、下载&#xff09;Swift&#xff1a;提供镜像存储的空间Nova&#xff1a;负责配额的修改、启动云主机&#xff08;实例&#xff09;、创建密钥对、绑定弹性IP等Keystone&#xff1a;提供…

jQuery(二):属性、元素、尺寸位置操作、事件

jQuery属性操作内容文本值元素操作尺寸、位置操作事件注册事件处理事件对象拷贝对象属性操作 1.获取固有属性语法 prop(‘‘属性’’) 固有属性就是html自带的&#xff0c;例如a元素里面的 href &#xff0c;input 元素里面的 type。 2.设置固有属性语法 prop(‘‘属性’’, …

Python NumPy 搜索 数组

前言NumPy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python科学计算库。使用NumPy&#xff0c;就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数&#xff0c;涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍Python NumPy 搜索 数组…

Linux小黑板(8)管道

"让我们,笑吧"一、什么是通信?管道是属于进程间通信的一个实现方式。再讲管道之前呢&#xff0c;我们先来说说什么叫做进程间通信。我们日常生活中&#xff0c;给自己的家人、朋友给一个call&#xff0c;或者弹一条微信、QQ等等&#xff0c;从而让人家能够知道我们想…

Databend 开源周报第 76 期

英文版移步&#xff1a;https://databend.rs/blog/2023-01-11-databend-weekly Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。即刻体验云服务&#xff1a;https://app.databend.com 。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的…