您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 关于海康威视摄像头实时提取视频,并且用opencv处理。

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

来源:网络整理     时间:2016/5/7 17:32:36     关键词:opencv,海康威视

关于网友提出的“关于海康威视摄像头实时提取视频,并且用opencv处理。”问题疑问,本网通过在网上对“关于海康威视摄像头实时提取视频,并且用opencv处理。”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

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

摄像头opencvrgb

我用海康威视的摄像实时读取视频,他的格式YV12格式,opencv处理的是RGB格式。我在网上找方法,一种方法1000个原创,而且没告诉参数怎么用。
YV12_to_RGB24(unsigned char* pYV12, unsigned char* pRGB24, int iWidth, int iHeight)  
这个函数的unsigned char* pRGB24是怎么定义的。最好有一个主函数。谢谢大家了。


解决方案1:

认真看这个博文
http://www.cnblogs.com/EdmundDwyane/p/5321816.html
希望能帮到你。

解决方案2:


// 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
{
}
}

解决方案3:

海康提供的SDK是没有将YV12->RGB数据,既然你能从回调函数中获取到YV12的数据,那就直接转换一下就可以


以上介绍了“关于海康威视摄像头实时提取视频,并且用opencv处理。”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/961676.html

相关图片

相关文章