环境:海康威视板卡采集的实时视频,要转成opencv能够处理的格式
我用GetOriginalImage(ChannelHandle, imageBuf, &Size);得到的imagebuf(它的定义UCHAR imageBuf[704 * 576 * 2];)
这个imagebuf是YUV422格式的网上有不少这种转化的代码,但试了一下基本都有错。本人不是搞图像处理的,只是用到了
请各位实际开发过的贴一下转化的代码,包含从imagebuf传参给转化的函数以及转到opencv的IplImage等。简单的例子吧实验可行的话,马上结贴给分。

解决方案 »

  1.   

    参考DWORD Rgb2Yuv(BYTE btR,BYTE btG,BYTE btB)
    {
    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的
      

  2.   

    XVID等开源库里,几乎各种颜色空间转换代码都有,多媒体指令优化的也很好。
      

  3.   

    .586
    .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
      

  4.   

    你可以看看OpenCV里的cvCvtColor和cvTransform函数
      

  5.   

    个人推荐XVID等开源代码,很专业并且效率很高
      

  6.   


    memcpy(pIplImage->imageData,imageBuffer,hSize);
    cvShowImage("image",pIplImage);