首页 > 其他分享 >opencv nv12转jpg, 拿到jpg数据

opencv nv12转jpg, 拿到jpg数据

时间:2023-03-09 09:34:42浏览次数:48  
标签:item int jpg opencv rgb24 rects nv12

typedef struct tagRect
{
    int CX;
    int CY;
    int Width;
    int Height;
}RECT;
typedef struct tagRect_ex {
    RECT rects[12];
}RECT_EX;

int test_nv12_2_jpeg(unsigned char* jpg_file_addr, unsigned char* nv12_addr, int nv12_width, int nv12_height,
    RECT* rects, int rect_nums)
{

    if (!jpg_file_addr || !nv12_addr || nv12_width <= 0 || nv12_height <= 0)
        return -1;
    int yuvNV12_size = nv12_width * nv12_height * 3 / 2;

    cv::Mat yuvNV12;
    cv::Mat rgb24;

    yuvNV12.create(nv12_height * 3 / 2, nv12_width, CV_8UC1);
    memcpy(yuvNV12.data, nv12_addr, yuvNV12_size);
    // nv12 mat to rgb24 mat
    cv::cvtColor(yuvNV12, rgb24, cv::COLOR_YUV2BGR_NV12);
    // draw react
    for (int i = 0; i < rect_nums; i++) {
        RECT* pRect = rects + i;
        cv::rectangle(rgb24, cv::Rect(pRect->CX, pRect->CY, pRect->Width, pRect->Height), cv::Scalar(0, 0, 255), 2, 8, 0);
} //cv::imwrite("./cv_test.jpg", rgb24); /*int rgb24_size = mat_2_jpg(rgb24, (char*)jpg_file_addr); return rgb24_size;*/ { //方法1 IplImage image(rgb24); int params[] = { CV_IMWRITE_JPEG_QUALITY, 80, 0 }; CvMat* pJpeg = cvEncodeImage(".jpeg", &image, 0); memcpy(jpg_file_addr, pJpeg->data.ptr, pJpeg->rows * pJpeg->cols); return pJpeg->rows * pJpeg->cols; } // 方法2 if (rgb24.empty()) { return -2; } std::vector<uchar> buff_jpg; buff_jpg.resize(rgb24.rows * rgb24.cols); std::vector<int> param = std::vector<int>(2); param[0] = CV_IMWRITE_JPEG_QUALITY; param[1] = 50; //param[2] = 0; cv::imencode(".jpg", rgb24, buff_jpg, param); memcpy(jpg_file_addr, buff_jpg.data(), buff_jpg.size()); return buff_jpg.size(); }

 

int main(int argc, char* argv[])
{
    FILE* nv12fp = NULL;
    const int SIZE = 200;
    char filename[SIZE] = { 0 };
    unsigned char* pNV12Buffer = NULL;
    int  dwNV12Size = 0;
    snprintf(filename, SIZE, "C:/Users/walt/Desktop/fsdownload/vdec.yuv"); //nv12
    nv12fp = fopen(filename, "rb");
    if (nv12fp)
    {
        fseek(nv12fp, 0, SEEK_END);
        dwNV12Size = ftell(nv12fp);
        pNV12Buffer = (unsigned char*)malloc(dwNV12Size * sizeof(unsigned char));
        memset(pNV12Buffer, 0x00, dwNV12Size);
        rewind(nv12fp);
        dwNV12Size = fread(pNV12Buffer, 1, dwNV12Size, nv12fp);

        unsigned char jpgBuf[512 * 1024] = { 0 };
        RECT_EX item;
        item.rects[0].CX = 930;
        item.rects[0].CY = 387;
        item.rects[0].Width = 240;
        item.rects[0].Height = 315;

        item.rects[1].CX = 552;
        item.rects[1].CY = 669;
        item.rects[1].Width = 105;
        item.rects[1].Height = 102;
        int jpg_size = test_nv12_2_jpeg(jpgBuf, pNV12Buffer, 1920, 1080, item.rects, 2);
        if (jpg_size > 0)
        {
            remove("success_2.jpg");
            FILE* wFp = fopen("success_2.jpg", "wb+");
            if (wFp)
            {
                fwrite(jpgBuf, jpg_size, 1, wFp);
                fclose(wFp);
                wFp = NULL;
            }
        }

        free(pNV12Buffer);
        pNV12Buffer = NULL;
        fclose(nv12fp);
        nv12fp = NULL;
    }

    getchar();
    return 0;
}

 

 

标签:item,int,jpg,opencv,rgb24,rects,nv12
From: https://www.cnblogs.com/caiyingyong/p/17197095.html

相关文章

  • OpenCV各版本差异与演化,从1.x到4.0
    写在前面最近因项目需要,得把OpenCV捡起来,登录OpenCV官网,竟然发现release了4.0.0-beata版本,所以借此机会,查阅资料,了解下OpenCV各版本的差异及其演化过程,形成了以下几点认识......
  • 01、Clion+Qt+Opencv详细配置
    1、下载opencvgithub这里下载3.4版本的,下载4.0版本容易出错2、安装opencvD:\opencv\opencv-3.4.16\opencv3、CMake构建3.1添加源文件和目标文件3.2选择mingw构建......
  • opencv sharp MatToBitmapSource
    privateBitmapSourceMatToBitmapSource(Matmat,refbyte[]gray){PixelFormatpf=PixelFormats.Gray8;intrawStride......
  • Ubuntu 22.10 下编译OpenCV 4.7.0
    最近入职的一家测控公司,项目中有涉及到机器视觉,对于机器视觉这一方向我完全是小白,准备作下知识储备,在LinuxC++环境下学习OpenCV;按照官方官方手册,下载源码编译成功后,运......
  • python利用opencv实现本地图片的识别与结果存储
    准备阶段准备三个目录一个放识别好的人脸标本,一个放需要识别的照片,一个放识别后的结果比如:需要安装opencv包、dlib包,以及下载人脸数据,参照:​​python利用opencv读取摄像头......
  • 图像处理之OpenCV用户界面
    1概述在OpenCV中,HighGUI模块为高层GUI图形用户界面模块,包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容。本章旨在为大家展开讲解OpenCV中......
  • 图像处理之OpenCV基础图像容器Mat
    1数字图像存储概述我们可以通过各种各样的方法从现实世界获取到数字图像,如借助相机、扫描仪、计算机摄像头或磁共振成像等。通常由显示屏上看到的都是真实而漂亮的图像,但是......
  • 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用(含源码)
    (文章目录)前言今天我们一起来使用LabVIEWAI视觉工具包快速实现图像的滤波与增强;图像灰度处理;阈值处理与设定;二值化处理;边缘提取与特征提取等基本操作。工具包的安装与下......
  • paddleocr_opencv_learn_颜色检测
    E:\song2\paddler_ocr\paddleocr_learn00\le00.pyfrompaddleocrimportPaddleOCR#2.声明PaddleOCR类ocr=PaddleOCR()img_path='./12.jpg'#3.执行预测......
  • python_opencv_画图_直线_矩形_圆_多边形_文字提示
    opencv绘图参数说明绘制形状的函数有一些共同的参数:img:要绘制形状的图片color:绘制的颜色彩色图就传入BGR的一组值,如蓝色就是(255,0,0)灰度图,传入一个灰度值就......