• artoolkit video 数据转换到 IplImage*


    代码

    //************************************
    // Method:    Fill_CV_IplImage
    // FullName:  Fill_CV_IplImage
    // Access:    public
    // Returns:   bool
    // Qualifier:
    // Parameter: int width
    // Parameter: int height
    // Parameter: char * imageData
    // Parameter: IplImage * pOutImg

    // Description:
    // pOutImg must be a IplImage* whose header has been created as 4 channels
    // and IPL_DEPTH_8U depth
    //************************************
    void Fill_CV_IplImage(int width, int height, char* imageData, IplImage* pOutImg)
    {
     // artoolkit video data to IplImage*
     // the key lies in the fact that arVideoGetImage returns buffer with order
     // RGBA, which is the 4-channel and IPL_DEPTH_8U-depth OpenCV buffer  
     IplImage *img = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 4);

     cvSetImageData(img, imageData, width * 4);

     cvCopy(img, pOutImg);

     cvReleaseImageHeader(&img);
    }

     如果需要再额外地将4通道图像转换到3通道的话,那么就需要使用以下的函数。

    代码
    //************************************
    // Method:    Fill_CV_IplImage
    // FullName:  Fill_CV_IplImage
    // Access:    public 
    // Returns:   bool
    // Qualifier:
    // Parameter: int width
    // Parameter: int height
    // Parameter: char * imageData
    // Parameter: IplImage * pOutImg

    // Description:
    // pOutImg must be a IplImage* whose header has been created as 3 channels
    // and IPL_DEPTH_8U depth
    //************************************
    void Fill_CV_IplImage(int width, int height, char* imageData, IplImage* pOutImg)
    {
        
    // artoolkit video data to IplImage*
        
    // the key lies in the fact that arVideoGetImage returns buffer with order
        
    // RGBA, which is the 4-channel and IPL_DEPTH_8U-depth OpenCV buffer        
        IplImage *img = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 4);

        cvSetImageData(img, imageData, width 
    * 4);
        
        
    // convert 4 channels to 3 channels
        IplImage *pRed = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
        IplImage 
    *pGreen = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
        IplImage 
    *pBlue = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
        IplImage 
    *pAlpha = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);

        cvSplit(img, pBlue, pGreen, pRed, pAlpha);

        cvMerge(pBlue, pGreen, pRed, NULL, pOutImg);
     
        cvReleaseImage(&pRed);
        cvReleaseImage(&pBlue);
        cvReleaseImage(&pGreen);
        cvReleaseImage(&pAlpha);
        cvReleaseImageHeader(&img);
    }

    推荐一篇博文,关于cvsplit和cvMerge写得很不错

    http://blog.sina.com.cn/s/blog_520a9c1d0100b8hr.html

  • 相关阅读:
    筛法“四不像”——《C解毒》试读
    五花八门的main()
    新编《守株待兔》—C语言版—兼聊为什么不应该用%d格式转换输出指针
    含糊之过、多做之过及乱做之过
    怎样调戏程序
    混乱是怎样炼成的——《C解毒》试读
    到处忙活与一劳永逸
    “函数声明”、“函数原型”与“函数定义”辨析
    关于函数原型的对话
    内裤外穿——错位及不伦不类
  • 原文地址:https://www.cnblogs.com/aicro/p/1950395.html
Copyright © 2020-2023  润新知