我使用的是海康DS-2CD852MF-E, 200万,网络摄像机,已经比较老了,不过SDK在海康官网下载的,开发流程都差不多.

海康摄像机回调解码后的视频数据格式为YV12,顺便说一下YV12的数据格式   YYYY  V U.   我这个是720P,即1280 * 720分辨率. 那么Y分量的数量为 1280 * 720 = 921600 字节, V = U 数量为Y的1/4, 即921600 / 4 =   230400字节,所以一帧720P的YV12数据量为1382400字节,与断点调试查看nSize一致.

这篇博客实现方法均来自网上找的代码,不是自己写的.仅作为一个记录.有一篇博客YUV与RGB格式转换里面就是YV12转到BGR的实现,看着它的代码改的.

1.用OpenCV  颜色空间转换函数

Mat pImgYCrCb, pImg;
pImgYCrCb.create(720, 1280,CV_8UC3);
pImg.create(720, 1280,CV_8UC3);
yv12toYUV(pImgYCrCb.data, (uchar*)pBuf, pFrameInfo->nWidth,pFrameInfo->nHeight,pImgYCrCb.step);
cvtColor(pImgYCrCb, pImg, CV_YCrCb2RGB);//转化为RGB图像,pImg是输出的帧
void yv12toYUV(uchar *outYuv, uchar *inYv12, int width, int height,int widthStep)  
{  
int col,row;  
unsigned int Y,U,V;  
int tmp;  
int idx;  
for (row=0; row<height; row++)  
{  
idx=row * widthStep;  
int rowptr=row*width;  
for (col=0; col<width; col++)  
{  
tmp = (row/2)*(width/2)+(col/2);  
Y=(unsigned int) inYv12[row*width+col];  
U=(unsigned int) inYv12[width*height+width*height/4+tmp];  
V=(unsigned int) inYv12[width*height+tmp];   outYuv[idx+col*3]   = Y;  
outYuv[idx+col*3+1] = U;  
outYuv[idx+col*3+2] = V;  
}  
}  
}

2.另一种opencv cvtColor实现,较为简单

Mat dst(pFrameInfo->nHeight,pFrameInfo->nWidth,CV_8UC3);//这里nHeight为720,nWidth为1280,8UC3表示8bit uchar 无符号类型,3通道值
Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight/2,pFrameInfo->nWidth,CV_8UC1,(uchar*)pBuf);
cvtColor(src,dst,CV_YUV2BGR_YV12);
imshow("bgr",dst);
waitKey(1);

3.只保留Y分量,观看黑白视频

uchar Y[921600];
memcpy(Y, pBuf, 921600);
if (Videofile==NULL)
{
sprintf_s(filename,"is_Y.yuv",0);
fopen_s(&Videofile,filename,"wb");
}
fwrite(Y,921600,1,Videofile);

4.ffmpeg转换

int sizeRGB = pFrameInfo->nWidth * pFrameInfo->nHeight * 3;  
uchar* pBGR24 = new unsigned char[sizeRGB];//开辟存储一副图像大小的内存空间,因为这里是RGB图像,所以需要 1280 * 720 * 3的大小
memset(pBGR24, 0, sizeRGB); 
YV12ToBGR24_FFmpeg((uchar*)pBuf, pBGR24,1280, 720);
Mat BGR24_IMG(pFrameInfo->nHeight,pFrameInfo->nWidth,CV_8UC3,pBGR24);
imshow("bgr24", BGR24_IMG);
waitKey(1);
delete []pBGR24;
bool YV12ToBGR24_FFmpeg(unsigned char* pYUV,unsigned char* pBGR24,int width,int height)
{
    if (width < 1 || height < 1 || pYUV == NULL || pBGR24 == NULL)
        return false;
    AVPicture pFrameYUV,pFrameBGR;
    avpicture_fill(&pFrameYUV,pYUV,AV_PIX_FMT_YUV420P,width,height);
    //U,V互换
    uint8_t * ptmp=pFrameYUV.data[1];
    pFrameYUV.data[1]=pFrameYUV.data[2];
    pFrameYUV.data [2]=ptmp;
    avpicture_fill(&pFrameBGR,pBGR24,AV_PIX_FMT_BGR24,width,height);     struct SwsContext* imgCtx = NULL;
    imgCtx = sws_getContext(width,height,AV_PIX_FMT_YUV420P,width,height,AV_PIX_FMT_BGR24,SWS_BILINEAR,0,0,0);     if (imgCtx != NULL){
        sws_scale(imgCtx,pFrameYUV.data,pFrameYUV.linesize,0,height,pFrameBGR.data,pFrameBGR.linesize);
        if(imgCtx){
            sws_freeContext(imgCtx);
            imgCtx = NULL;
        }
        return true;
    }
    else{
        sws_freeContext(imgCtx);
        imgCtx = NULL;
        return false;
    }
}

注意这里ffmpeg会出现函数被否决,需要用新接口替换,也可以忽略这个警告,并且头文件需要用extern "C"包含

extern "C"
{
#include <libavcodec\avcodec.h>
#include <libswscale\swscale.h>
#include <libavutil\pixfmt.h>
#include <libavutil\imgutils.h>
}
#pragma   warning(disable: 4996)//忽略被否决的警告

海康网络摄像机YV12转换为BGR,由opencv Mat显示 (转)的更多相关文章

  1. (HK1-1)海康网络摄像机的使用

    https://blog.csdn.net/u014552102/article/details/86700057 一.手机客户端操作:  首先在莹石商城官网https://www.ys7.com/下 ...

  2. 海康网络摄像机调用SDK解码Java版

    两个回调函数: FRealDataCallBack 实现预览回调数据 DecCallBack 解码回调函数 在HCNetSDK.java补充相关函数和结构声明 //播放库函数声明,PlayCtrl.d ...

  3. EasyDarwin在做拉模式转发海康RTSP摄像机视频流的过程中出现花屏问题的解决方案

    问题描述 在3年前我当时基于EasyDarwin为用户开发了一款RTSP拉模式转发的程序,也发布了一篇博客<用Darwin开发RTSP级联服务器(拉模式转发)>,当时考虑的很简单,只要将R ...

  4. 通过rtmpdump推送海康视频流到red5服务器

    现在主流的网络摄像机都支持标准H264视频格式,例如 海康网络摄像机, 通过海康提供的网络SDK可以获取到视频码流.我测试的这款相机,视频编码采用的是H264,音频编码采用的是G711a. 这里,我仅 ...

  5. (HK1-2)海康相机直接连接电脑不经过路由器设置

    解决电脑无法通过网线直连海康摄像机的问题 https://blog.csdn.net/u014552102/article/details/86708371 一.现象:    通过博主的另外一篇博客h ...

  6. HTML5播放RTSP,H5播放RTSP,解决方案源码,基于海康网络摄像头

    视频是用的海康网络摄像头(支持RTSP,标准H.264 RTP封装的设备),可以通过 rtsp://admin:1008@192.0.0.64:81/h264/ch1/main/av_stream   ...

  7. RTSP安防摄像机(海康大华宇视等)如何推送到RTMP流媒体服务器进行直播

    方案介绍 目前互联网直播的CDN和标准RTMP流媒体服务器通常只能接收RTMP格式的音视频推流.目前市场上有一些自带RTMP推流的摄像机和编码器,可以直接在其rtmp推流配置里面配置推送到RTMP流媒 ...

  8. 主流芯片解决方案Ambarella的高清网络摄像机、德州仪器和控制海思

    (本文由四川艾普作为数码科技有限公司 苏斌.范清华 收集) 高清网络视频监控发展到今天.正的高清时代.诸多有实力的高清摄像机厂家的产品线也逐渐完好起来,高清网络视频监控的配套产品有更加丰富和成熟.与此 ...

  9. 在做RTSP摄像机H5无插件直播中遇到的对接海康摄像机发送OPTIONS心跳时遇到的坑

    我们在实现一套EasyNVR无插件直播方案时,选择了采用厂家无关化的通用协议RTSP/Onvif接入摄像机IPC/NVR设备,总所周知,Onvif是摄像机的发现与控制管理协议,Onvif用到的流媒体协 ...

随机推荐

  1. word-wrap ,word-break 和white-space 的联系

    在工作中我遇到一个问题,其实功能也不复杂,就是上面有个textarea标签 ,里面输入内容,下面有个显示效果 ,有个条件就是 上面输入的什么格式(比如换行等等),下面显示的也是 什么格式.如下图: 这 ...

  2. Jquery的事件操作和文档操作

    对于熟悉前端开发的小伙伴,相信对于Jquery一定不陌生,相对于JavaScript的繁琐,Jquery更加的简洁,当然简洁不意味着简单,我们可以使用Jquery完成我们想要实现全部功能,这里为小白们 ...

  3. 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载

    title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...

  4. AbpZero--2.如何启动

    1.直接启动 VS中直接启动 2.IIS站点 IIS中配置一个站点来启动(推荐) 3.登录 系统默认创建2个用户 默认用户名:admin 密码:123qwe 租户:Default  默认用户名:adm ...

  5. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  6. 【SAP业务模式】之ICS(三):前台操作

    本片博文开始讲解SAP前台是如何实现ICS业务模式的. 一.VA01开立销售订单 我这里为了方便,创建了一个订单类型ZMIV作为公司间销售的订单类型,其实公司间销售订单跟标准的销售订单是一致的.同时, ...

  7. iOS之绘制虚线

    /*   ** lineFrame:     虚线的 frame   ** length:        虚线中短线的宽度   ** spacing:       虚线中短线之间的间距   ** co ...

  8. 高仿it之家新闻客户端源码

    仿it之家新闻客户端界面,数据为本地假数据.仅实现了新闻模块的功能. 源码下载:http://code.662p.com/list/11_1.html 详细说明:http://android.662p ...

  9. sqlserver批量修改首字母为大写

    'hello world'  ---->   'Hello world' update tableName set columnName=CHAR(ASCII(SUBSTRING(columnN ...

  10. Linux环境下常见漏洞利用技术(培训ppt+实例+exp)

    记得以前在drops写过一篇文章叫 linux常见漏洞利用技术实践 ,现在还可以找得到(https://woo.49.gs/static/drops/binary-6521.html), 不过当时开始 ...