环境: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);
这个本身也有错误啊???
报“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);
这个本身也有错误啊???
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 时发生访问冲突
”
直接把YUV数据存在RGB里面怎么改都是没有意义的
然后 pBkImg= cvCreateImage(cvSize(pFrame->width/2, pFrame->height/2), IPL_DEPTH_8U,1);
再去1通道数据试试吧,不要用cvCvtColor了
先把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图片,如果实时视频流运行个几天会不会电脑崩溃啊?后面处理速度会不会跟不上啊
至于处理速度,这个应该没有什么太大的问题的
主要是从YUV转成BMP不会写SaveYUVToBmpFile("a.bmp", imageBuf, 704, 576);
这个函数是海康板卡SDK上自带的, 我就拿来用了。。网上找了些从YUV到BMP的代码,似乎调不出来啊
可以预览吗?