添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
int height = 960; int yuvNV12_size = width * height * 3 / 2; int rgb24_size = width * height; Mat yuvNV12; Mat rgb24; vector files_yuv; glob("D:/work/data-yuv/*.yuv", files_yuv); for (size_t i = 0; i < files_yuv.size(); i++) printf("image file : %s \n", files_yuv[i].c_str()); //1.read nv12 file to nv12 mat FILE* f = fopen(files_yuv[i].c_str(), "r"); memset(buff, 0, 2000000); fread(buff, 1, yuvNV12_size, f); yuvNV12.create(height * 3 / 2, width, CV_8UC1); memcpy(yuvNV12.data, buff, yuvNV12_size); //2.cvt nv12 mat to rgb24 mat cvtColor(yuvNV12, rgb24, COLOR_YUV2BGR_NV12); //3.imwrite std::string savePath = files_yuv[i] + "_rgb.jpg"; imwrite(savePath, rgb24); fflush(f); fclose(f); return 0;

需要注意:

  1. char buff[2000000]预分配的数组较大,如果放置到main函数里面,会有如下报错:

0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000E3CE403000)。
Unhandled exception at 。。。。。 : Stack overflow (parameters: 0x0000000000000001。。。。。

解决办法:
(1)如测试用例,把该数组定义成全局变量;
(2)根据new, delete来创建数组:

char buff* = new char[2000000]; 
delete[] buff;

本测试用例会反复使用该buff,建议用方式1;

  1. c4996 error warning (fopen,fopen_s)

在Project properties->Configuration Properties->C/C+±>Preprocessor->Preprocessor Definitions 添加_CRT_SECURE_NO_WARNINGS

实测代码如下:#include &lt;iostream&gt;#include &lt;stdio.h&gt;#include &lt;string.h&gt;#include &lt;opencv2/opencv.hpp&gt;using namespace cv;using namespace std;char buff[2000000];int main(){ int width = 1280; int height = 960; int yuvNV12_size = 因为在网上没找到教怎么自己生成sws_scale()函数参数的,我也是摸索了好几个钟头才弄清楚,所以,特写此文章。 我的整个工程Gitee源码目录:qt_gui_simple2complex/ source / 007_Embeded_Player 代码展示: #include "libswscale/swscale.h" //
ChatGPT是一款由OpenAI推出的自然语言处理模型,通过对海量数据的学习和训练,能够模拟人类的语言表达和思维模式,实现智能对话和文本生成等功能。而在ChatGPT的不断发展过程中,插件功能的加入无疑为其功能拓展和应用场景的丰富提供了重要的支持。 插件功能指的是一些独立的、可扩展的功能模块,能够为ChatGPT提供更多的服务和应用能力。这些插件可以是由OpenAI自身开发的,也可以是由第三方开发者基于ChatGPT开发的,它们可以用于自动化文本分类、自然语言处理、文本摘要、文本翻译等各种领域。这些插件不仅能够提高ChatGPT的智能程度和对话质量,也能够满足不同用户的需求和场景。 插件功能的加入意味着什么?首先,它扩展了ChatGPT的应用场景,让其在更多的领域和场景中得到应用,如电商客服、智能语音助手等。其次,它提升了ChatGPT的可扩展性和灵活性,可以通过添加或删除插件的方式来实现功能的增减和定制化。最后,它促进了开发者社区的形成和发展,吸引更多的开发者参与到ChatGPT的开发和应用中来,推动ChatGPT技术的不断完善和发展。 然而,插件功能的加入也带来了一些挑战
Python读取YUV格式文件,并使用opencv显示的方法 opencv可以读取的图片类型比较多,但大多是比较常见的类型,比如”.jpg”和”.png”,但它不能直接读取YUV格式文件,需要通过python读取YUV文件,并进行相应的换后,才能被opencv读取,并进行后续相应的处理. 话不多说,直接上程序。 import cv2 from numpy import * import Image screenLevels = 255.0 def yuv_import(filename,dims,numfrm,startfrm): fp=open(filename,'rb') Mat rgb2; cvtColor(rgb, nv12, COLOR_RGB2YUV_I420); //imwrite("/home/ubuntu/nv12.yuv",nv12,0); FILE* f = fopen(".
由于yuvrgb格式之间存在换关系,因此要实现yuv格式视频到rgb格式视频的换,我们需要进行以下步骤: 1. 打开yuv格式视频文件读取每一帧视频的yuv数据。 2. 将yuv数据换为rgb数据,这是一个复杂的计算过程,需要根据视频宽度、高度、颜色采样等信息计算。可以使用FFmpeg等开源库进行换。 3. 将rgb数据写入新的rgb格式视频文件。 4. 播放rgb格式视频文件,可以使用SDL、Qt、OpenCV等库进行播放。 下面是一份用C语言实现的yuv视频rgb视频的示例代码: #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define WIDTH 640 #define HEIGHT 480 #define YUV_FILE "test.yuv" #define RGB_FILE "test.rgb" void yuv2rgb(uint8_t *yuv, uint8_t *rgb) { int y = yuv[0]; int u = yuv[1] - 128; int v = yuv[2] - 128; int r = (298 * y + 409 * v + 128) >> 8; int g = (298 * y - 100 * u - 208 * v + 128) >> 8; int b = (298 * y + 516 * u + 128) >> 8; rgb[0] = (uint8_t)r; rgb[1] = (uint8_t)g; rgb[2] = (uint8_t)b; int main() { FILE *yuv_file, *rgb_file; uint8_t yuv_buffer[WIDTH * HEIGHT * 3 / 2]; uint8_t rgb_buffer[WIDTH * HEIGHT * 3]; uint8_t *yuv_ptr, *rgb_ptr; int row, col; yuv_file = fopen(YUV_FILE, "rb"); rgb_file = fopen(RGB_FILE, "wb"); while (fread(yuv_buffer, 1, WIDTH * HEIGHT * 3 / 2, yuv_file) == WIDTH * HEIGHT * 3 / 2) { yuv_ptr = yuv_buffer; rgb_ptr = rgb_buffer; for (row = 0; row < HEIGHT; row++) { for (col = 0; col < WIDTH; col++) { yuv2rgb(yuv_ptr, rgb_ptr); yuv_ptr += 3; rgb_ptr += 3; fwrite(rgb_buffer, 1, WIDTH * HEIGHT * 3, rgb_file); fclose(yuv_file); fclose(rgb_file); return 0; 这段代码实现了从yuv格式读取视频数据,换为rgb格式并写入新的文件中。注意,这里的yuv格式指的是NV12格式,在这种格式下,一个像素点对应一个y值,但对应一个uv值对。在yuv2rgb函数中,我们使用了ITU-R BT.601标准将yuv换为rgb值,最终得到一个3字节的rgb数据。在主函数中,我们批量读取yuv数据,然后将每个像素点的yuv换为rgb值,并将所有的rgb值写入rgb文件中。