关于海康威视摄像头实时提取视频,并且用opencv处理。

张嫩嫩 2016-03-12 04:56:58
我用海康威视的摄像实时读取视频,他的格式YV12格式,opencv处理的是RGB格式。我在网上找方法,一种方法1000个原创,而且没告诉参数怎么用。
YV12_to_RGB24(unsigned char* pYV12, unsigned char* pRGB24, int iWidth, int iHeight)
这个函数的unsigned char* pRGB24是怎么定义的。最好有一个主函数。谢谢大家了。
...全文
10337 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
为取经而来 2017-11-16
  • 打赏
  • 举报
回复
楼主,你好,我们可以把海康威视得到的YV12数据保存在本地吗
为取经而来 2017-11-16
  • 打赏
  • 举报
回复
楼主你好,我们可以用opencv将海康威视读取的视频保存下来吗?
阿先森 2016-03-26
  • 打赏
  • 举报
回复
认真看这个博文 http://www.cnblogs.com/EdmundDwyane/p/5321816.html 希望能帮到你。
李_军 2016-03-22
  • 打赏
  • 举报
回复
// Conversion from RGB to YUV420 int RGB2YUV_YR[256], RGB2YUV_YG[256], RGB2YUV_YB[256]; int RGB2YUV_UR[256], RGB2YUV_UG[256], RGB2YUV_UBVR[256]; int RGB2YUV_VG[256], RGB2YUV_VB[256]; // Conversion from YUV420 to RGB24 static long int crv_tab[256]; static long int cbu_tab[256]; static long int cgu_tab[256]; static long int cgv_tab[256]; static long int tab_76309[256]; static unsigned char clp[1024]; //for clip in CCIR601 // Table used for RGB to YUV420 conversion void InitLookupTable() { int i; for (i = 0; i < 256; i++) RGB2YUV_YR[i] = int((float)65.481 * (i<<8)); for (i = 0; i < 256; i++) RGB2YUV_YG[i] = int((float)128.553 * (i<<8)); for (i = 0; i < 256; i++) RGB2YUV_YB[i] = int((float)24.966 * (i<<8)); for (i = 0; i < 256; i++) RGB2YUV_UR[i] = int((float)37.797 * (i<<8)); for (i = 0; i < 256; i++) RGB2YUV_UG[i] = int((float)74.203 * (i<<8)); for (i = 0; i < 256; i++) RGB2YUV_VG[i] = int((float)93.786 * (i<<8)); for (i = 0; i < 256; i++) RGB2YUV_VB[i] = int((float)18.214 * (i<<8)); for (i = 0; i < 256; i++) RGB2YUV_UBVR[i] = int((float)112 * (i<<8)); } // Convert from RGB24 to YUV420 //int ConvertRGB2YUV(int w,int h,unsigned char *bmp,unsigned int *yuv) int ConvertRGB2YUV(int w,int h,unsigned char *bmp,unsigned char*yuv) { //unsigned int *u,*v,*y,*uu,*vv; //unsigned int *pu1,*pu2,*pu3,*pu4; //unsigned int *pv1,*pv2,*pv3,*pv4; //unsigned char *r,*g,*b; //int i,j; //uu=new unsigned int[w*h]; //vv=new unsigned int[w*h]; unsigned char *u,*v,*y,*uu,*vv; unsigned char *pu1,*pu2,*pu3,*pu4; unsigned char *pv1,*pv2,*pv3,*pv4; unsigned char *r,*g,*b; int i,j; uu=new unsigned char[w*h]; vv=new unsigned char[w*h]; if(uu==NULL || vv==NULL) return 0; y=yuv; u=uu; v=vv; // Get r,g,b pointers from bmp image data.... r=bmp; g=bmp+1; b=bmp+2; //Get YUV values for rgb values. .. for(i=0;i<h;i++) { for(j=0;j<w;j++) { *y++=( RGB2YUV_YR[*r] +RGB2YUV_YG[*g]+RGB2YUV_YB[*b]+1048576)>>16; *u++=(-RGB2YUV_UR[*r] -RGB2YUV_UG[*g]+RGB2YUV_UBVR[*b]+8388608)>>16; *v++=( RGB2YUV_UBVR[*r]-RGB2YUV_VG[*g]-RGB2YUV_VB[*b]+8388608)>>16; r+=3; g+=3; b+=3; } } // Now sample the U & V to obtain YUV 4:2:0 format // Sampling mechanism... /* @ -> Y # -> U or V @ @ @ @ # # @ @ @ @ @ @ @ @ # # @ @ @ @ */ // Get the right pointers... u=yuv+w*h; v=u+(w*h)/4; // For U pu1=uu; pu2=pu1+1; pu3=pu1+w; pu4=pu3+1; // For V pv1=vv; pv2=pv1+1; pv3=pv1+w; pv4=pv3+1; // Do sampling.... for(i=0;i<h;i+=2) { for(j=0;j<w;j+=2) { *u++=(*pu1+*pu2+*pu3+*pu4)>>2; *v++=(*pv1+*pv2+*pv3+*pv4)>>2; pu1+=2; pu2+=2; pu3+=2; pu4+=2; pv1+=2; pv2+=2; pv3+=2; pv4+=2; } pu1+=w; pu2+=w; pu3+=w; pu4+=w; pv1+=w; pv2+=w; pv3+=w; pv4+=w; } delete uu; delete vv; return 1; } // //Initialize conversion table for YUV420 to RGB // void InitConvertTable() { long int crv,cbu,cgu,cgv; int i,ind; crv = 104597; cbu = 132201; /* fra matrise i global.h */ cgu = 25675; cgv = 53279; for (i = 0; i < 256; i++) { crv_tab[i] = (i-128) * crv; cbu_tab[i] = (i-128) * cbu; cgu_tab[i] = (i-128) * cgu; cgv_tab[i] = (i-128) * cgv; tab_76309[i] = 76309*(i-16); } for (i=0; i<384; i++) clp[i] =0; ind=384; for (i=0;i<256; i++) clp[ind++]=i; ind=640; for (i=0;i<384;i++) clp[ind++]=255; } // // Convert from YUV420 to RGB24 // void ConvertYUV2RGB(unsigned char *src0,unsigned char *src1,unsigned char *src2,unsigned char *dst_ori, int width,int height) { //送入的图像必须是已经4位对齐的宽度,否则会有问题,现在一般情况都是对齐的分辨率出来的 int y1,y2,u,v; unsigned char *py1,*py2; int i,j, c1, c2, c3, c4; unsigned char *d1, *d2; py1=src0; py2=py1+width; d1=dst_ori; d2=d1+3*width; for (j = 0; j < height; j += 2) { for (i = 0; i < width; i += 2) { u = *src1++; v = *src2++; c1 = crv_tab[v]; c2 = cgu_tab[u]; c3 = cgv_tab[v]; c4 = cbu_tab[u]; //up-left y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-left y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; //up-right y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-right y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; } d1 += 3*width; d2 += 3*width; py1+= width; py2+= width; } /* //给图片做上下镜像操作 for (j = 0; j < height/2; j++) { CopyMemory(src0,dst_ori+j*3*width,3*width); CopyMemory(dst_ori+j*3*width,dst_ori+(height-1-j)*3*width,3*width); CopyMemory(dst_ori+(height-1-j)*3*width,src0,3*width); } */ } void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2) { long lFrameType = pFrameInfo->nType; CString ss; int fWidth; int fHeight; DWORD YTotal; char cFileName[256]; if (!m_capFile) { return; } if(lFrameType ==T_YV12) { int i; int rgbsize; fWidth=pFrameInfo->nWidth; fHeight=pFrameInfo->nHeight; FrameCount=fWidth*fHeight*3/2; rgbsize=fWidth*fHeight*3; BYTE *rgbdata2 = new BYTE[rgbsize]; memset(rgbdata2, 0, rgbsize); BYTE * yp = pBuf; BYTE * up = pBuf + fWidth*fHeight; BYTE * vp = pBuf + fWidth*fHeight + fWidth*fHeight/4; ConvertYUV2RGB(yp,up,vp,rgbdata2, fWidth, fHeight); } } else { } }
_船长_ 2016-03-14
  • 打赏
  • 举报
回复
海康提供的SDK是没有将YV12->RGB数据,既然你能从回调函数中获取到YV12的数据,那就直接转换一下就可以
lx624909677 2016-03-14
  • 打赏
  • 举报
回复
海康的摄像头都提供了很详细的开发文档,直接看不就行么,而且他们还会给一个开源的demo,几乎你要的功能这个demo里全有
张嫩嫩 2016-03-14
  • 打赏
  • 举报
回复
海康的sdk还有转rgb的?我不清楚,我找了一下 没找到。 大神 麻烦你能告诉我吗
shiter 2016-03-12
  • 打赏
  • 举报
回复
你这应该用海康的sdk 转成grb完后opencv再处理?
本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块),工作在ap模式下,并且用电脑通过WIFI去连接开发板实现主机和开发板的无线网络局域网通信,这样就可以用WIFI网络取代板载ethernet有线网络方式来进行调试和局域网视频预览。现在很多的视频摄像头产品都要求支持无线网络连接功能,本季课程主要是针对这方面开发技术讲解的。随着通信行业发展,网速越来越快,网络也从文本时代发展越过语音时代到了现在视频时代,“优酷、爱奇艺”、“微视频”、“直播”等的出现也是视频逐步成为主流媒体的证据和表现。航拍、视频监控、刷脸过关检测、汽车ADAS系统等应用也是视频在主流行业中的应用,因此视频的采集、编解码、传输、识别等技术变得越来越有价值,涌现出了“海康威视”、“大华股份”、“深圳英飞拓”等一批明星企业,名扬海内外,动辄市值几百亿。同时在芯片级,国产华为海思HI35XX系列视频编解码方案也逐步取代进口芯片(如TI、安霸)成为主流方案。视频行业技术含量高、难度大、学习周期长、发展变化快而资料少,因此行业比较缺人、工资较高。如海康威视,普通高校硕士研究生应届进入年薪普遍高于15-20万,在嵌入式linux领域也算高工资技术方向了。本项目是朱老师及其团队推出的一个嵌入式linux领域重量级企业级实战项目,选用华为海思HI3518E方案,结合OV9712/AR0130 Sensor实现图像采集和H.264编码压缩,并通过ethernet和WIFI,以socket实时流和RTSP等方式,实现720P/960P高清视频传输。本项目共分11季,从海思SDK开发环境搭建,到sample程序讲解、SDK中API函数解析,到H.264编解码、RTSP流媒体传输、MP4文件打包,到图像IQ调试、图像识别等视频领域高阶内容,可以说从零基础入手,对图像采集、编解码、网络传输、图像存储和识别做了全方位的详细讲解和代码分析,是目前市面上**一套系统讲解图像和视频技术的视频课程。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧