环境:海康威视板卡采集的实时视频,要转成opencv能够处理的格式
我用GetOriginalImage(ChannelHandle, imageBuf, &Size);得到的imagebuf(它的定义UCHAR imageBuf[704 * 576 * 2];)
这个imagebuf是YUV422格式的网上有不少这种转化的代码,但试了一下基本都有错。本人不是搞图像处理的,只是用到了
请各位实际开发过的贴一下转化的代码,包含从imagebuf传参给转化的函数以及转到opencv的IplImage等。简单的例子吧实验可行的话,马上结贴给分。
我用GetOriginalImage(ChannelHandle, imageBuf, &Size);得到的imagebuf(它的定义UCHAR imageBuf[704 * 576 * 2];)
这个imagebuf是YUV422格式的网上有不少这种转化的代码,但试了一下基本都有错。本人不是搞图像处理的,只是用到了
请各位实际开发过的贴一下转化的代码,包含从imagebuf传参给转化的函数以及转到opencv的IplImage等。简单的例子吧实验可行的话,马上结贴给分。
解决方案 »
- 修改调用的DLL名时遇到的问题
- 思路问题,请教老师
- 将xml中元素的属性读入tree control控件中的问题
- dll中使用new失败?
- 我想问一下com dll和支持com功能的exe有什么区别?
- 关于Edit control
- 50分请教一下,怎么把RICHEDIT编辑的文字存成RTF文件和把RTF文件读出来用RICHEDIT显示?
- 解释一下面的内容
- 请教各位大虾,为什么我的Recordset::Open()老是出错.
- 求助大佬,用VC++加上serial类,写一个可以使支持modbus PLC X1灯亮的程序
- 谁有http 这一套函数用法的小例子,实现打开某网络,最好给我讲讲用法啊,谢谢!!
- 在MFC中创建一个类的问题,求高手!
{
BYTE btY,btU,btV;
DWORD dwYUYV; if(btB == 0 && btG == 0 && btR == 0){
btY = 0;
btU = 0;
btV = 0;
}
else{
btY = 0.257 * btR + 0.504 * btG + 0.098 * btB + 16;
btU = -0.148 * btR - 0.291 * btG + 0.439 * btB + 128;
btV = 0.439 * btR - 0.368 * btG - 0.071 * btB + 128;
}
dwYUYV = (btY<<24) | (btV<<16) | (btY<<8) | (btU);
return dwYUYV;
}RGB转YUYV的
.mmx
.model flat_TEXT64 segment page public use32 'CODE'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 8yuv2rgb_constants:x0000_0000_0010_0010 dq 00000000000100010h
x0080_0080_0080_0080 dq 00080008000800080h
x00FF_00FF_00FF_00FF dq 000FF00FF00FF00FFh
x00002000_00002000 dq 00000200000002000h
cy dq 000004A8500004A85h
crv dq 03313000033130000h
cgu_cgv dq 0E5FCF377E5FCF377h
cbu dq 00000408D0000408Dhofs_x0000_0000_0010_0010 = 0
ofs_x0080_0080_0080_0080 = 8
ofs_x00FF_00FF_00FF_00FF = 16
ofs_x00002000_00002000 = 24
ofs_cy = 32
ofs_crv = 40
ofs_cgu_cgv = 48
ofs_cbu = 56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GET_Y MACRO mma,uyvy
IF &uyvy
psrlw mma,8
ELSE
pand mma,[edx+ofs_x00FF_00FF_00FF_00FF]
ENDIF
ENDMGET_UV MACRO mma,uyvy
GET_Y mma,1-uyvy
ENDMYUV2RGB_INNER_LOOP MACRO uyvy,rgb32,no_next_pixel;; This YUV422->RGB conversion code uses only four MMX registers per
;; source dword, so I convert two dwords in parallel. Lines corresponding
;; to the "second pipe" are indented an extra space. There's almost no
;; overlap, except at the end and in the two lines ed ***. movd mm0,[esi]
movd mm5,[esi+4]
movq mm1,mm0
GET_Y mm0,&uyvy ; mm0 = __________Y1__Y0
movq mm4,mm5
GET_UV mm1,&uyvy ; mm1 = __________V0__U0
GET_Y mm4,&uyvy
movq mm2,mm5 ; *** avoid reload from [esi+4]
GET_UV mm5,&uyvy
psubw mm0,[edx+ofs_x0000_0000_0010_0010]
movd mm6,[esi+8-4*(no_next_pixel)]
GET_UV mm2,&uyvy ; mm2 = __________V2__U2
psubw mm4,[edx+ofs_x0000_0000_0010_0010]
paddw mm2,mm1
GET_UV mm6,&uyvy
psubw mm1,[edx+ofs_x0080_0080_0080_0080]
paddw mm6,mm5
psllq mm2,32
psubw mm5,[edx+ofs_x0080_0080_0080_0080]
punpcklwd mm0,mm2 ; mm0 = ______Y1______Y0
psllq mm6,32
pmaddwd mm0,[edx+ofs_cy] ; mm0 scaled
punpcklwd mm4,mm6
paddw mm1,mm1
pmaddwd mm4,[edx+ofs_cy]
paddw mm5,mm5
paddw mm1,mm2 ; mm1 = __V1__U1__V0__U0 * 2
paddd mm0,[edx+ofs_x00002000_00002000]
paddw mm5,mm6
movq mm2,mm1
paddd mm4,[edx+ofs_x00002000_00002000]
movq mm3,mm1
movq mm6,mm5
pmaddwd mm1,[edx+ofs_crv]
movq mm7,mm5
paddd mm1,mm0
pmaddwd mm5,[edx+ofs_crv]
psrad mm1,14 ; mm1 = RRRRRRRRrrrrrrrr
paddd mm5,mm4
pmaddwd mm2,[edx+ofs_cgu_cgv]
psrad mm5,14
paddd mm2,mm0
pmaddwd mm6,[edx+ofs_cgu_cgv]
psrad mm2,14 ; mm2 = GGGGGGGGgggggggg
paddd mm6,mm4
pmaddwd mm3,[edx+ofs_cbu]
psrad mm6,14
paddd mm3,mm0
pmaddwd mm7,[edx+ofs_cbu]
add esi,8
add edi,12+4*rgb32
IFE &no_next_pixel
cmp esi,ecx
ENDIF
psrad mm3,14 ; mm3 = BBBBBBBBbbbbbbbb
paddd mm7,mm4
pxor mm0,mm0
psrad mm7,14
packssdw mm3,mm2 ; mm3 = GGGGggggBBBBbbbb
packssdw mm7,mm6
packssdw mm1,mm0 ; mm1 = ________RRRRrrrr
packssdw mm5,mm0 ; *** avoid pxor mm4,mm4
movq mm2,mm3
movq mm6,mm7
punpcklwd mm2,mm1 ; mm2 = RRRRBBBBrrrrbbbb
punpcklwd mm6,mm5
punpckhwd mm3,mm1 ; mm3 = ____GGGG____gggg
punpckhwd mm7,mm5
movq mm0,mm2
movq mm4,mm6
punpcklwd mm0,mm3 ; mm0 = ____rrrrggggbbbb
punpcklwd mm4,mm7
IFE &rgb32
psllq mm0,16
psllq mm4,16
ENDIF
punpckhwd mm2,mm3 ; mm2 = ____RRRRGGGGBBBB
punpckhwd mm6,mm7
packuswb mm0,mm2 ; mm0 = __RRGGBB__rrggbb <- ta dah!
packuswb mm4,mm6IF &rgb32
movd [edi-16],mm0 ; store the quadwords independently
movd [edi-8],mm4 ; (and in pieces since we may not be aligned)
psrlq mm0,32
psrlq mm4,32
movd [edi-12],mm0
movd [edi-4],mm4
ELSE
psrlq mm0,8 ; pack the two quadwords into 12 bytes
psllq mm4,8 ; (note: the two shifts above leave
movd [edi-12],mm0 ; mm0,4 = __RRGGBBrrggbb__)
psrlq mm0,32
por mm4,mm0
movd [edi-8],mm4
psrlq mm4,32
movd [edi-4],mm4
ENDIF ENDM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YUV2RGB_PROC MACRO procname,uyvy,rgb32 PUBLIC C _&procname;;void __cdecl procname(
;; [esp+ 4] const unsigned char* src,
;; [esp+ 8] unsigned char* dst,
;; [esp+12] const unsigned char* src_end,
;; [esp+16] int stride);_&procname PROC push esi
push edi mov eax,[esp+16+8]
mov esi,[esp+12+8] ; read source bottom-up
mov edi,[esp+8+8]
mov edx,offset yuv2rgb_constantsloop0:
lea ecx,[esi-8]
sub esi,eax align 32
loop1:
YUV2RGB_INNER_LOOP uyvy,rgb32,0
jb loop1 YUV2RGB_INNER_LOOP uyvy,rgb32,1 sub esi,eax
cmp esi,[esp+4+8]
ja loop0 emms
pop edi
pop esi
retn_&procname ENDP ENDM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YUV2RGB_PROC mmx_YUY2toRGB24,0,0
YUV2RGB_PROC mmx_YUY2toRGB32,0,1
YUV2RGB_PROC mmx_UYVYtoRGB24,1,0
YUV2RGB_PROC mmx_UYVYtoRGB32,1,1;;;;;;;;;;;;;;;;;;;;;;;;;;;;; END
memcpy(pIplImage->imageData,imageBuffer,hSize);
cvShowImage("image",pIplImage);