精华内容
下载资源
问答
  • libyuv源码

    2015-11-08 09:28:41
    libyuv的源码,libyuv是一个可以对YUV格式转换和旋转、缩放的开源库。 URL: http://code.google.com/p/libyuv/ Version: 1433 License: BSD License File: LICENSE Description: libyuv is an open source project ...
  • libyuv类库

    2018-08-05 16:59:04
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库
  • libyuv压缩包

    2019-02-27 15:22:20
    我自己测试结果:当将每一帧相机预览图片源数据转换成bitmap再进行缩放,旋转,镜像等操作后消耗的时间差不多是使用该库进行同样操作后消耗的时间的2倍。由此可以看出libyuv库的优势。 该库是Google官方库,放心...
  • libyuv使用

    2020-09-01 10:14:48
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统。x86、x64、arm架构上进行编译执行,支持SSE、AVX、NEON等SIMD指令加速。 以下说...

    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统。x86、x64、arm架构上进行编译执行,支持SSE、AVX、NEON等SIMD指令加速。

    以下说一下libyuv在Windows7VS2013 x64上的编译步骤及使用:

    1.        从https://code.google.com/p/libyuv/source/checkout或者https://github.com/lemenkov/libyuv下载libyuv源代码;我是通过svn直接从google下载的,版本是1433,更新日期2015年6月13日。

    2.        通过cmake gui生成vs2013 x64project,不须要额外的配置;

    3.        打开Project.slnproject,又一次编译,就可以生成yuv.lib静态库。

    4.    新加入一个test_libyuv控制台project。用于測试yuv.lib的正确性。測试代码例如以下:

     

    #include <iostream>
    #include <assert.h>
    #include "libyuv.h"
    #include <cmath>
    #include <opencv2/opencv.hpp>
    
    void test_BGRAToI420(const cv::Mat& matSrc, int width, int height, int size_frame, cv::Mat& matDst);
    void test_BGRAToNV21(const cv::Mat& matSrc, int width, int height, int size_frame, cv::Mat& matDst);
    void test_BGRAToNV12(const cv::Mat& matSrc, int width, int height, int size_frame, cv::Mat& matDst);
    
    int main(int argc, char* argv[])
    {
    	cv::Mat matSrc = cv::imread("cat.jpg");
    	if (!matSrc.data) {
    		std::cout << "read src image error" << std::endl;
    		return -1;
    	}
    
    	//cv::resize(matSrc, matSrc, cv::Size(500, 111));
    
    	int width = matSrc.cols;
    	int height = matSrc.rows;
    	int size_frame = width * height;
    
    	cv::Mat matI420, matNV21, matNV12;
    
    	test_BGRAToI420(matSrc, width, height, size_frame, matI420);
    	test_BGRAToNV21(matSrc, width, height, size_frame, matNV21);
    	test_BGRAToNV12(matSrc, width, height, size_frame, matNV12);
    
    	assert((matI420.depth() == matNV21.depth()) && (matI420.depth() == matNV12.depth()));
    	assert((matI420.channels() == matNV21.channels()) && (matI420.channels() == matNV12.channels()));
    
    	for (int i = 0; i < height; i++) {
    		const unsigned char* pI420 = matI420.ptr(i);
    		const unsigned char* pNV21 = matNV21.ptr(i);
    		const unsigned char* pNV12 = matNV12.ptr(i);
    
    		for (int j = 0, m = 0; j < width; j++, m+=4) {
    			if ((pI420[m] != pNV21[m]) || (pI420[m] != pNV12[m]) ||
    				(pI420[m + 1] != pNV21[m + 1]) || (pI420[m + 1] != pNV12[m + 1]) ||
    				(pI420[m + 2] != pNV21[m + 2]) || (pI420[m + 2] != pNV12[m + 2]) ||
    				(pI420[m + 3] != pNV21[m + 3]) || (pI420[m + 3] != pNV12[m + 3])) {
    				std::cout << "convert error" << std::endl;
    			}
    		}
    	}
    
    	std::cout << "ok" << std::endl;
    	return 0;
    }
    
    void test_BGRAToI420(const cv::Mat& matSrc, int width, int height, int size_frame, cv::Mat& matDst)
    {
    	// BGRA <--> I420(YUV420P)
    	cv::Mat matBGRA, matI420, matARGB;
    	cv::cvtColor(matSrc, matBGRA, cv::COLOR_BGR2BGRA);
    	matARGB = cv::Mat(height, width, CV_8UC4, cv::Scalar::all(0));
    	libyuv::BGRAToARGB(matBGRA.data, width * 4, matARGB.data, width * 4, width, height);
    
    	uchar* pI420 = new uchar[width * height + (width + 1) / 2 * (height + 1) / 2 * 2];
    	memset(pI420, 0, sizeof(uchar) * (width * height + (width + 1) / 2 * (height + 1) / 2 * 2));
    	uchar* dst_y = pI420;
    	int dst_y_stride = width;
    	uchar* dst_u = pI420 + size_frame;
    	int dst_u_stride = (width + 1) / 2;
    	uchar* dst_v = pI420 + size_frame + dst_u_stride * (height + 1) / 2;
    	int dst_v_stride = (width + 1) / 2;
    
    	libyuv::BGRAToI420(matARGB.data, width * 4, dst_y, dst_y_stride, dst_u, dst_u_stride, dst_v, dst_v_stride, width, height);
    	matI420 = cv::Mat(height, width, CV_8UC4, cv::Scalar::all(0));
    	libyuv::I420ToBGRA(dst_y, dst_y_stride, dst_u, dst_u_stride, dst_v, dst_v_stride, matI420.data, width * 4, width, height);
    	cv::Mat matBGRA_ = cv::Mat(height, width, CV_8UC4, cv::Scalar::all(0));
    	libyuv::ARGBToBGRA(matI420.data, width * 4, matBGRA_.data, width * 4, width, height);
    	cv::imwrite("I420_bgra.jpg", matBGRA_);
    	matBGRA_.copyTo(matDst);
    
    	int count_diff = 0;
    	int max_diff = 0;
    	int threshold = 20;//
    	for (int i = 0; i < height; i++) {
    		uchar* pSrc = matBGRA.ptr(i);
    		uchar* pDst = matBGRA_.ptr(i);
    		for (int j = 0, m = 0; j < width; j++, m += 4) {
    			int tmp = std::max(abs(pSrc[m] - pDst[m]), abs(pSrc[m + 1] - pDst[m + 1]));
    			tmp = std::max(tmp, abs(pSrc[m + 2] - pDst[m + 2]));
    			if (tmp > max_diff)
    				max_diff = tmp;
    
    			if (abs(pSrc[m] - pDst[m]) > threshold ||
    				abs(pSrc[m + 1] - pDst[m + 1]) > threshold ||
    				abs(pSrc[m + 2] - pDst[m + 2]) > threshold) {
    				count_diff++;
    				//std::cout << i << "    " << j << std::endl;
    			}
    
    		}
    	}
    
    	std::cout << "convert I420 to BGRA diff max: " << max_diff << std::endl;
    	if (count_diff > width + height) {//
    		std::cout << "convert I420 to BGRA error." << std::endl;
    		std::cout << "diff num: " << count_diff << std::endl;
    	}
    
    	delete[] pI420;
    }
    
    void test_BGRAToNV12(const cv::Mat& matSrc, int width, int height, int size_frame, cv::Mat& matDst)
    {
    	// BGRA <--> NV12
    	cv::Mat matBGRA, matNV12;
    	cv::cvtColor(matSrc, matBGRA, cv::COLOR_BGR2BGRA);
    
    	uchar* pNV12 = new uchar[width * height + ((width + 1) / 2) * ((height + 1) / 2) * 2];
    	memset(pNV12, 0, sizeof(uchar) * (width * height + ((width + 1) / 2) * ((height + 1) / 2) * 2));
    	uchar* dst_y = pNV12;
    	int dst_y_stride = width;
    	uchar* dst_vu = pNV12 + size_frame;
    	int dst_vu_stride = (width + 1) / 2 * 2;
    
    	libyuv::ARGBToNV12(matBGRA.data, width * 4, dst_y, dst_y_stride, dst_vu, dst_vu_stride, width, height);
    	matNV12 = cv::Mat(height, width, CV_8UC4, cv::Scalar::all(0));
    	libyuv::NV12ToARGB(dst_y, dst_y_stride, dst_vu, dst_vu_stride, matNV12.data, width * 4, width, height);
    	cv::imwrite("NV12_bgra.jpg", matNV12);
    	matNV12.copyTo(matDst);
    
    	int count_diff = 0;
    	int max_diff = 0;
    	int threshold = 20;//
    	for (int i = 0; i < height; i++) {
    		uchar* pSrc = matBGRA.ptr(i);
    		uchar* pDst = matNV12.ptr(i);
    		for (int j = 0, m = 0; j < width; j++, m += 4) {
    			int tmp = std::max(abs(pSrc[m] - pDst[m]), abs(pSrc[m + 1] - pDst[m + 1]));
    			tmp = std::max(tmp, abs(pSrc[m + 2] - pDst[m + 2]));
    			if (tmp > max_diff)
    				max_diff = tmp;
    
    			if (abs(pSrc[m] - pDst[m]) > threshold ||
    				abs(pSrc[m + 1] - pDst[m + 1]) > threshold ||
    				abs(pSrc[m + 2] - pDst[m + 2]) > threshold) {
    				count_diff++;
    				//std::cout << i << "    " << j << std::endl;
    			}
    		}
    	}
    
    	std::cout << "convert NV12 to BGRA diff max: " << max_diff << std::endl;
    	if (count_diff > width + height) {//
    		std::cout << "convert NV12 to BGRA error." << std::endl;
    		std::cout << "diff num: " << count_diff << std::endl;
    	}
    
    	delete[] pNV12;
    }
    
    void test_BGRAToNV21(const cv::Mat& matSrc, int width, int height, int size_frame, cv::Mat& matDst)
    {
    	// BGRA <--> NV21
    	cv::Mat matBGRA, matNV21;
    	cv::cvtColor(matSrc, matBGRA, cv::COLOR_BGR2BGRA);
    
    	uchar* pNV21 = new uchar[width * height + ((width + 1) / 2) * ((height + 1) / 2) * 2];
    	memset(pNV21, 0, sizeof(uchar) * (width * height + ((width + 1) / 2) * ((height + 1) / 2) * 2));
    	uchar* dst_y = pNV21;
    	int dst_y_stride = width;
    	uchar* dst_vu = pNV21 + size_frame;
    	int dst_vu_stride = (width + 1) / 2 * 2;
    
    	libyuv::ARGBToNV21(matBGRA.data, width * 4, dst_y, dst_y_stride, dst_vu, dst_vu_stride, width, height);
    	matNV21 = cv::Mat(height, width, CV_8UC4, cv::Scalar::all(0));
    	libyuv::NV21ToARGB(dst_y, dst_y_stride, dst_vu, dst_vu_stride, matNV21.data, width * 4, width, height);
    	cv::imwrite("NV21_bgra.jpg", matNV21);
    	matNV21.copyTo(matDst);
    
    	int count_diff = 0;
    	int max_diff = 0;
    	int threshold = 20;//
    	for (int i = 0; i < height; i++) {
    		uchar* pSrc = matBGRA.ptr(i);
    		uchar* pDst = matNV21.ptr(i);
    		for (int j = 0, m = 0; j < width; j++, m += 4) {
    			int tmp = std::max(abs(pSrc[m] - pDst[m]), abs(pSrc[m + 1] - pDst[m + 1]));
    			tmp = std::max(tmp, abs(pSrc[m + 2] - pDst[m + 2]));
    			if (tmp > max_diff)
    				max_diff = tmp;
    
    			if (abs(pSrc[m] - pDst[m]) > threshold ||
    				abs(pSrc[m + 1] - pDst[m + 1]) > threshold ||
    				abs(pSrc[m + 2] - pDst[m + 2]) > threshold) {
    				count_diff++;
    				//std::cout << i << "    " << j << std::endl;
    			}
    		}
    	}
    
    	std::cout << "convert NV21 to BGRA diff max: " << max_diff << std::endl;
    	if (count_diff > width + height) {//
    		std::cout << "convert NV21 to BGRA error." << std::endl;
    		std::cout << "diff num: " << count_diff << std::endl;
    	}
    
    	delete[] pNV21;
    }

    原文参考:https://www.cnblogs.com/yfceshi/p/7092525.html

     

    展开全文
  • Android 使用libyuv对Android yuv数据进行缩放,旋转,镜像,裁剪等操作
  • libyuv库使用

    万次阅读 2018-09-13 18:54:51
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。 https://github.com/lemenkov/libyuv 下载,cmakerProject.sln工程,重新编译,即可生成libyuv.lib 静态库; 编译好的库:...

    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。

    https://github.com/lemenkov/libyuv

    下载,cmaker  Project.sln工程,重新编译,即可生成libyuv.lib  静态库;

    编译好的库:https://download.csdn.net/download/shuilan0066/10665172

     

    导入这个库

    在linker->General->Additional Library Directiories   添加libyuv.lib的目录

       linker->Input->Additonal Dependencies    添加libyuv_d.lib (debug环境下)

       如果是在一个工程中使用

       

       在c/C++->General->Additional Include Directories 添加libyuv的include目录

       如果是一个模块工程,比如静态库模块工程中使用

       则同样在主工程中添加lib目录、添加.lib

       在静态库模块中添加添加libyuv的include目录,在静态库模块中调用

       

    使用这个库

    #include "libyuv.h"  

     

    1)ARGBToYUV420

    ARGBToYUV420(char* src, char* dst, int width, int height)
    	{
    		int byte_width = width * 4;
    		width -= width % 2;
    		height -= height % 2;
    		int wxh = width * height;
    		uint8_t* des_y = (uint8_t*)dst;
    		uint8_t* des_u = des_y + wxh;
    		uint8_t* des_v = des_u + wxh / 4;
    		
    
    
    // 		libyuv::RGB24ToI420((const uint8*)src, byte_width,
    // 			des_y, width,
    // 			des_u, width / 2,
    // 			des_v, width / 2,
    // 			width, height);
    		libyuv::ARGBToI420((const uint8_t*)src, byte_width,
    			des_y, width,
    			des_u, width / 2,
    			des_v, width / 2,
    			width, height);
    	}
    

     

    2)YUV420ToARGB

    YUV420ToARGB(char* src, char* dst, int width, int height)
    	{
    		uint8_t* src_y = (uint8_t*)src;
    		uint8_t* src_u = src_y + width * height;
    		uint8_t* src_v = src_u + width * height / 4;
    		
    // 		libyuv::I420ToRGB24(
    // 			src_y, width,
    // 			src_u, width / 2,
    // 			src_v, width / 2,
    // 			(uint8_t*)dst, width * 3,
    // 			width, height);
    		libyuv::I420ToARGB(
    			src_y, width,
    			src_u, width / 2,
    			src_v, width / 2,
    			(uint8_t*)dst, width * 4,
    			width, height);
    	}

     示例:

     			std::string argbData;
     			argbData.resize(width*height * 4);
     			YUV420ToARGB((char*)data, (char*)argbData.c_str(), width, height);
    
    ARGBToYUV420((char*)argbData.c_str(), (char*)yuvData, width, height);

     

    3) I420CopyEx

    CopyI420Data(int type, std::string& dest, const std::string& src, int width, int height, ImageYuvDataType image_type, POINT pt)
    {
    	int left = (width_ - width) / 2;
    	left -= left % 2;
    	int top = (height_ - height) / 2;
    	top -= top % 2;
    	switch (type)
    	{
    	case SIZENW:
    	{
    		left = pt.x;
    		top = pt.y;
    		break;
    	}
    	case SIZENE:
    	{
    		left = width_ - width - pt.x;
    		left -= left % 2;
    		top = pt.y;
    		break;
    	}
    	case SIZESW:
    	{
    		left = pt.x;
    		top = height_ - height - pt.y;
    		top -= top % 2;
    		break;
    	}
    	case SIZESE:
    	{
    		left = width_ - width - pt.x;
    		left -= left % 2;
    		top = height_ - height - pt.y;
    		top -= top % 2;
    		break;
    	}
    	default:
    		break;
    	}
    	if (left < 0)
    		left = 0;
    	if (top < 0)
    		top = 0;
    	int stride_y = width;
    	int stride_u = width / 2;
    	int stride_v = width / 2;
    	int stride_ya = 0;
    	int stride_ua = 0;
    	int stride_va = 0;
    	if (image_type == kYuvDataTypeImage || image_type == kYuvDataTypeImageAlpha)
    	{
    		stride_y *= 2;
    		stride_u *= 2;
    		stride_v *= 2;
    		if (image_type == kYuvDataTypeImageAlpha)
    		{
    			stride_ya = stride_y;
    			stride_ua = stride_u;
    			stride_va = stride_v;
    		}
    	}
    	uint8_t* src_y = (uint8_t*)src.c_str();
    	uint8_t* src_u = src_y + stride_y * height;
    	uint8_t* src_v = src_u + stride_u * height / 2;
    	uint8_t* des_y = (uint8_t*)dest.c_str();
    	uint8_t* des_u = des_y + width_ * height_;
    	uint8_t* des_v = des_u + width_ * height_ / 4;
    	des_y += left + top * width_;
    	des_u += left / 2 + top * width_ / 4;
    	des_v += left / 2 + top * width_ / 4;
    	I420CopyEx(src_y, stride_y, src_y + width, stride_ya,
    		src_u, stride_u, src_u + width / 2, stride_ua,
    		src_v, stride_v, src_v + width / 2, stride_va,
    		des_y, width_,
    		des_u, width_ / 2,
    		des_v, width_ / 2,
    		width, height);
    }

     

    示例:

     

    	static char clr_temp = 0x80;
    	nbase::NAutoLock auto_lock(&lock_);
    	int size = width_ * height_ * 3 / 2;
    	std::string data_ret;  //要生成的视频帧数据
    	data_ret.append(size, (char)clr_temp); //默认黑色 1000 0000 不透明

    在此视频帧上拷贝其它I420数据

    	std::string data_temp; //临时数据
    	data_temp.append(size, (char)clr_temp);
    
        //得到采集的数据,并将其拷贝到背景画布数据中
    		if (capture_.GetFrame()->GetVideoFrame("", time, (char*)data_temp.c_str(), width, height, false, false))
    		{
    			CopyI420Data(SIZEALL, data_ret, data_temp, width, height);
    			frame_show = true;
    		}

     

     

     

    展开全文
  • libyuv-master

    2018-05-09 08:40:54
    libyuv源代码,可用于yuv与rgb的相互转化,yuv的旋转
  • libyuv—AndroidStudio 编译libyuv

    千次阅读 2017-06-03 17:49:15
    libyuv是google 开源的用于实现对各种yuv数据之间的转换包括裁剪、缩放、旋转,以及yuv和rgb 之间的转换,底层有一部分代码是基于汇编实现的,大大提高了转换速度。在Android 平台下一般用于处理直接从摄像头获取的...

    libyuv是google 开源的用于实现对各种yuv数据之间的转换包括裁剪、缩放、旋转,以及yuv和rgb 之间的转换,底层有一部分代码是基于汇编实现的,大大提高了转换速度。在Android 平台下一般用于处理直接从摄像头获取的原始yuv数据。 Android studio 最新版的已经支持了ndk 编译了,支持原先的Android.mk方式编译个Cmake编译方式,这里才用原始的编译方式。我用的版本是2.3.2,ndk版本是r13b。

    1.下载NDK r3b

    https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip

    2.在Project Structure 设置ndk 路径

     

    Android.mk 文件内容

     

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_C_INCLUDES := \
        ./jni/include
    
    LOCAL_MODULE 	:= libyuv
    LOCAL_LDLIBS 	:= -ljnigraphics -llog
    
    
    
    LOCAL_SRC_FILES := \
    source/compare_common.cc \
    source/compare_gcc.cc \
    source/compare_neon64.cc \
    source/compare_win.cc \
    source/compare.cc \
    source/convert_argb.cc \
    source/convert_from_argb.cc \
    source/convert_from.cc \
    source/convert_jpeg.cc \
    source/convert_to_argb.cc \
    source/convert_to_i420.cc \
    source/convert.cc \
    source/cpu_id.cc \
    source/mjpeg_decoder.cc \
    source/mjpeg_validate.cc \
    source/planar_functions.cc \
    source/rotate_any.cc \
    source/rotate_argb.cc \
    source/rotate_common.cc \
    source/rotate_gcc.cc \
    source/rotate_mips.cc \
    source/rotate_neon64.cc \
    source/rotate_win.cc \
    source/rotate.cc \
    source/row_any.cc \
    source/row_common.cc \
    source/row_gcc.cc \
    source/row_mips.cc \
    source/row_neon64.cc \
    source/row_win.cc \
    source/scale_any.cc \
    source/scale_argb.cc \
    source/scale_common.cc \
    source/scale_gcc.cc \
    source/scale_mips.cc \
    source/scale_neon64.cc \
    source/scale_win.cc \
    source/scale.cc \
    source/video_common.cc
    
    ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
        LOCAL_CFLAGS += -DLIBYUV_NEON
        LOCAL_SRC_FILES += \
            source/compare_neon.cc.neon    \
            source/rotate_neon.cc.neon     \
            source/row_neon.cc.neon        \
            source/scale_neon.cc.neon
    endif
    
    include $(BUILD_SHARED_LIBRARY)
    


    Application.mk 内容

     

     

     

     

    APP_PLATFORM := android-14
    APP_ABI := armeabi-v7a


    gradle 配置

     

     

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
        defaultConfig {
            applicationId "com.example.libyuv"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        externalNativeBuild {
            ndkBuild {
                path "jni/Android.mk"
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
    
    
        defaultConfig {
            externalNativeBuild {
                ndkBuild {
                    arguments "NDK_APPLICATION_MK:=jni/Application.mk", "APP_PLATFORM:=android-14"
                    abiFilters "armeabi-v7a"
                }
            }
        }
    
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
    }
    

     

    下载地址

     

    https://github.com/XIAIBIANCHENG/android-libyuv

     

    展开全文
  • libyuv开源库

    2019-07-19 17:39:35
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。 GitHub:https://github.com/lemenkov/libyuv 待更新

    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。

    GitHub:https://github.com/lemenkov/libyuv

    待更新

    展开全文
  • android使用libyuv

    千次阅读 2018-05-07 19:31:18
    libyuv可以帮我们将rgb转换成yuv,也可以用来旋转yuv,转换成其他yuv格式 libyuv git地址是https://chromium.googlesource.com/libyuv/libyuv,由于众所周知的原因,无法直接访问,我们可以用gitlab来中转一下 ...
  • 转载自 林志河 的简书文章 使用libyuv对YUV数据进行缩放,旋转,镜像,裁剪等操作   在Android做过自定义Camera的朋友应该都知道,我们可以通过public void onPreviewFrame(byte[] data, Camera camera)回调中...
  • YUV图片旋转

    2017-03-23 16:48:00
    1、从H264视频流中解析出来的图片格式是YUV ... 在iOS系统上,利用Accelcerate库进行加速,其中旋转的方法是libYUV旋转的20倍   //测试YUV to RGBA 旋转然后 再到YUV 性能 int width = ...
  • libyuv编译for ios

    2019-08-22 16:53:09
    libyuv是谷歌开源的一个库,用于图像颜色空间转换,缩放,旋转。由于其支持多媒体指令集的优化,效率较高,在视频处理领域用的很多。 GitHub上的源码:https://github.com/lemenkov/libyuv 网上有一个ios版本:...
  • NDK编译Libyuv

    千次阅读 2017-04-19 18:30:23
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。git下载...
  • libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换、旋转、缩放等的库。它是跨平台的,可在 Windows、Linux、Mac、Android 等操作系统,x86、x64、arm 架构上进行编译运行,支持 SSE、AVX、NEON 等 SIMD ...
  • libyuv官方编译步骤

    万次阅读 2018-01-05 16:11:59
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。 ...
  • libyuv库的使用

    千次阅读 2018-03-20 11:33:21
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。 下面说...
  • libyuv的编译与使用

    2020-05-25 08:31:00
    libyuv是Google开源的实现YUV数据格式转换,旋转,缩放和镜像等操作的库。编译使用cmake+ndk来编译.so文件在新建的AS工程中建一个module--libyuv,该mo...
  • Win10 VS2015 libyuv编译

    2018-08-22 17:54:13
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。 编译...
  • 编译google libyuv so库

    千次阅读 2018-09-03 22:46:27
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。支持在Windows、Linux、Mac、等平台 和x86、x64、arm架构上进行编译执行,支持SSE、AVX、NEON等SIMD指令加速。 下载 下载地址: ...
  • Google提供了一套Image的开源库libyuv(git clone https://chromium.googlesource.com/libyuv/libyuv),实现对各种yuv数据之间的转换,包括数据转换,裁剪,缩放,旋转。这里由于有墙,所以可以在github中clone这个...
  • android libyuv库的使用

    千次阅读 2016-09-22 14:35:03
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。 下面说...
  • 2.1 什么是libyuv libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD...
  • libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,,支持SSE、AVX、NEON等SIMD指令加速.VS 2015 WIN64等编译出来的库无法使用SIMD指令,效率大大降低! 网上提供的办法都是基于...
  • libyuv_all_win64.rar

    2020-07-23 16:32:51
    libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,,支持SSE、AVX、NEON等SIMD指令加速 由于需要比较麻烦,所以采用clang编译效果与google原始编译的效果一致.
  • libyuv32位和64位静态库,实现对各种yuv数据之间的转换,包括数据转换,裁剪,缩放,旋转

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
热门标签
关键字:

libyuv旋转