win下编译opencv+libjpeg-turbo

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

前言

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源码


opencvhttps://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后会执行第一次ConfiguringConfiguring完后勾选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库方便调用。

此时都配好了再次点击ConfigureConfigure完后点击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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6