关于内存中的图像使用OPENCV方式显示有关问题,来高手帮忙!
关于内存中的图像使用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);
------最佳解决方案--------------------
如果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,楼主搜搜吧
------其他解决方案--------------------
我的是网络摄像机,不需要驱动,只需要IP,登录名,密码,端口号这些,我用正常SDK的方法可以显示,可我需要使用OPENCV进行处理,现在读到OPENCV中直接变成灰度图了,没法取像素
------其他解决方案--------------------
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)
我从网络摄像机读取视频流,数据存储在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);
------最佳解决方案--------------------
如果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,楼主搜搜吧
------其他解决方案--------------------
我的是网络摄像机,不需要驱动,只需要IP,登录名,密码,端口号这些,我用正常SDK的方法可以显示,可我需要使用OPENCV进行处理,现在读到OPENCV中直接变成灰度图了,没法取像素
------其他解决方案--------------------
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)