环境:VS2008+ win2003 + MFC + opencv1.0 + 海康威视的板卡先用MFC+海康板卡做了视频采集,采集的格式是YUV422,之后想用opencv来处理,在RGB到灰度空间转化时出错
报“bad number of channels” 关键程序如下:代码: 全选
   IplImage* pFrame = cvCreateImageHeader(cvSize(1024,768),IPL_DEPTH_8U,1);
   UCHAR imageBuf[704 * 576*2];
   DWORD Size = 704 * 576*2;
   //海康板卡SDK获取原始图像
   GetOriginalImage(ChannelHandle[0], imageBuf, &Size);   
   //将获取的图像数据转换为IplImage*
   cvSetData(pFrame,imageBuf,1024);     //声明IplImage指针
     IplImage* pBkImg= NULL;     int nFrmNum = 0;     //逐帧读取视频
     while(pFrame)
     {           
            nFrmNum++;            //如果是第一帧,需要申请内存,并初始化
            if(nFrmNum == 1)
            {
              pBkImg= cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
                 //转化成单通道图像再处理
              cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY)      
            }
     }
运行到cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY)时报错,错误信息是“bad number of channels”
网上搜索一下,有说通道数问题的,说将RGB通道数改成3就好了我改了一下也不对
有的说要先把视频格式YUV转成RGB再处理的。
请知道的指教一下。谢谢...
会不会
//海康板卡SDK获取原始图像
GetOriginalImage(ChannelHandle[0], imageBuf, &Size);
这个本身也有错误啊???   

解决方案 »

  1.   

    我把上述
    IplImage* pFrame = cvCreateImageHeader(cvSize(1024,768),IPL_DEPTH_8U,1);改成IplImage* pFrame = cvCreateImageHeader(cvSize(1024,768),IPL_DEPTH_8U,3);这样运行到
    cvSetData(pFrame,imageBuf,1024);时报错“Image step is wrong”把cvSetData(pFrame,imageBuf,1024)改成cvSetData(pFrame,imageBuf,1024 * 3)这样前面通过了
    运行到后面
    cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY)
    报“
    VideoMFCApp.exe 中的 0x0046403e 处未处理的异常: 0xC0000005: 读取位置 0x00135000 时发生访问冲突
    ” 
      

  2.   

    你既然是要做灰度,直接把YUV的Y分量保存出来不就好了,你用RGB格式来保存YUV的数据,然后用cvCvtColor怎么能实现呢,或者你直接先把YUV转换成RGB再转
    直接把YUV数据存在RGB里面怎么改都是没有意义的
      

  3.   

    你应该是想取个巧,利用YUYV的格式取Y分量的,这样的算法没有通用性,视频解码格式一变就出问题了,如果真要这么做,IplImage* pFrame = cvCreateImageHeader(cvSize(1024,768),IPL_DEPTH_8U,2);
    然后 pBkImg= cvCreateImage(cvSize(pFrame->width/2, pFrame->height/2), IPL_DEPTH_8U,1);
    再去1通道数据试试吧,不要用cvCvtColor了
      

  4.   

    我现在换成这种写法了
    先把YUV数据转成bmp图片
    然后再用cvloadimage导入进来 UCHAR imageBuf[704 * 576*2];
    DWORD Size = 704 * 576*2;
    //海康板卡SDK获取原始图像
    GetOriginalImage(ChannelHandle[0], imageBuf, &Size);
    SaveYUVToBmpFile("a.bmp", imageBuf, 704, 576);
    IplImage* pFrame = cvLoadImage("a.bmp",1);这样是能够实现。不过有异常,点击运行界面,会突然崩掉。另外一个问题就是,每次读出数据先转成bmp图片,如果实时视频流运行个几天会不会电脑崩溃啊?后面处理速度会不会跟不上啊
      

  5.   

    按照你的做法,一直存储BMP图像的话,硬盘早晚会满的,肯定会出问题,你直接在内存里做YUV和BMP转换不行么?只要及时的释放资源,就没有这个问题了
    至于处理速度,这个应该没有什么太大的问题的
      

  6.   

    在内存里怎么转??
    主要是从YUV转成BMP不会写SaveYUVToBmpFile("a.bmp", imageBuf, 704, 576);
    这个函数是海康板卡SDK上自带的, 我就拿来用了。。网上找了些从YUV到BMP的代码,似乎调不出来啊
      

  7.   

    我也遇到这个问题啊,忘指教,不知道楼主板卡sdk的怎么个调用顺序哦?有哪些必要步骤没有?
    可以预览吗?