读书人

关于内存中的图像使用OPENCV方式显示有

发布时间: 2012-12-21 12:03:49 作者: rapoo

关于内存中的图像使用OPENCV方式显示问题,来高手帮忙!~
我从网络摄像机读取视频流,数据存储在char *pbuffer里,我想使用OPENCV的方式显示,使用下面方法显示的是灰度图像,怎么显示彩色图像呢?(单通道和三通道的方法都试过,三通道显示的也是灰度的图,读出来发现R==G==B)
我的方法:
IplImage * Img=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
Img->pBuffer = new char [nWidth * nHeight];
memcpy(Img->pBuffer,pbuffer,nYSize);
cvShowImage("img",Img);
[最优解释]

引用:
引用:
参考OpenCV\modules\highgui\src\cap_v4l.cpp


谢谢您的回答,不过T_YV12不是该文章说提到的V4L2格式

如果highgui不原生支持,恐怕暂时只能自己写格式转换相关代码了。
[其他解释]
参考OpenCV\modules\highgui\src\cap_v4l.cpp

[其他解释]
IplImage * Img=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
改为
IplImage * Img=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
再试试?

cvCreateImage
创建头并分配数据

IplImage* cvCreateImage( CvSize size, int depth, int channels );
size
图像宽、高.
depth
图像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 无符号8位整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
channels
每个元素(像素)的颜色通道数量.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:
b0 g0 r0 b1 g1 r1 ...
虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像.
函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式

header = cvCreateImageHeader(size,depth,channels);
cvCreateData(header); //只是创建空间,并不会初始化空间内的数据

[其他解释]
前提是确认pbuffer里面的原始数据是彩色而不是灰度的。
[其他解释]
该不会你摄像头驱动临时设置为灰度模式了吧。
为什么不直接用
capture=cvCaptureFromCAM(...
IplImage* iplImg=cvQueryFrame(capture);


[其他解释]
不知道用cvCaptureFromCAM能不能直接操作网络摄像机。
[其他解释]
得调哪个api,楼主搜搜吧
[其他解释]
引用:
该不会你摄像头驱动临时设置为灰度模式了吧。
为什么不直接用
capture=cvCaptureFromCAM(...
IplImage* iplImg=cvQueryFrame(capture);


我的是网络摄像机,不需要驱动,只需要IP,登录名,密码,端口号这些,我用正常SDK的方法可以显示,可我需要使用OPENCV进行处理,现在读到OPENCV中直接变成灰度图了,没法取像素
[其他解释]
引用:
不知道用cvCaptureFromCAM能不能直接操作网络摄像机。


SORRY,下午想回复您,但服务器升级,一直点不了
您说的方法不可取,cvCaptureFromCAM是从本机读取驱动的方式,网络相机驱动是不存在本机的,所以您的方法不能用,而且我也试过,我机器不光连着网络摄像机,同时也连着USB相机,您说的方法只能调取USB相机
[其他解释]
我先写下我取内容的流程的吧,
海康网络相机初始化
->NET_DVR_RealPlay_V30()播放
->g_RealDataCallBack_V30()启动回调
->PlayM4_SetDecCallBack分析数据
->DecCBFun截取视频流(回调↓)
void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize, FRAME_INFO * pFrameInfo, long nReserved1,long)


{
// pBuf存的图像
// pFrameInfo->dwFrameNum // 图像帧数。
// pFrameInfo->nWidth // 画面宽,单位像素。如果是音频数据则为 0;
// pFrameInfo->nHeight // 画面高。如果是音频数据则为 0;
// pFrameInfo->nFrameRate // 编码时产生的图像帧率。
// pFrameInfo->nStamp // 时标信息,单位毫秒
// pFrameInfo->nType // 数据类型,T_AUDIO16,T_RGB32 == 7, T_YV12 == 3
......
memcpy(pImage->imageData,pBuf,nWidth * nHeight);
......
} // 上面是我程序显示的代码,当时定义的是单通道到数据
如果定义3通道图像下面这么写会出错,上面单通道没问题,
IplImage *img= cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
memcpy(img->imageData,pBuf,nWidth * nHeight *3);
在网上看有人也用你给的方法
header = cvCreateImageHeader(size,depth,channels);
cvCreateData(header);
这个方法我也试过,不会出错,是3通道图像,但图像还是灰的,我取图像的任意一点看发现R==G==B
[其他解释]
pFrameInfo->nType == T_YV12 是不是说图像是YV12格式,不是RGB格式呢?
怎么进行转换呀?
[其他解释]

引用:
参考OpenCV\modules\highgui\src\cap_v4l.cpp


谢谢您的回答,不过T_YV12不是该文章说提到的V4L2格式
[其他解释]
如果你能从设备中读取到正确的RGB值的话,你可以先验证颜色值是否正确,然后再传递给OPENCV
[其他解释]
谢谢zhao4zhong1 这么长时间的关注,结贴了!

读书人网 >C++

热点推荐