关于内存中的图像使用OPENCV方式显示问题,来高手帮忙!~

无0_0名 2012-02-16 11:04:17
我从网络摄像机读取视频流,数据存储在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);
...全文
375 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
无0_0名 2012-03-02
  • 打赏
  • 举报
回复
谢谢zhao4zhong1 这么长时间的关注,结贴了!
赵4老师 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 b510030 的回复:]
引用 10 楼 zhao4zhong1 的回复:
参考OpenCV\modules\highgui\src\cap_v4l.cpp


谢谢您的回答,不过T_YV12不是该文章说提到的V4L2格式
[/Quote]
如果highgui不原生支持,恐怕暂时只能自己写格式转换相关代码了。
nuistbaker 2012-02-28
  • 打赏
  • 举报
回复
如果你能从设备中读取到正确的RGB值的话,你可以先验证颜色值是否正确,然后再传递给OPENCV
无0_0名 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhao4zhong1 的回复:]
参考OpenCV\modules\highgui\src\cap_v4l.cpp
[/Quote]

谢谢您的回答,不过T_YV12不是该文章说提到的V4L2格式
赵4老师 2012-02-22
  • 打赏
  • 举报
回复
参考OpenCV\modules\highgui\src\cap_v4l.cpp
无0_0名 2012-02-22
  • 打赏
  • 举报
回复
pFrameInfo->nType == T_YV12 是不是说图像是YV12格式,不是RGB格式呢?
怎么进行转换呀?
无0_0名 2012-02-18
  • 打赏
  • 举报
回复
我先写下我取内容的流程的吧,
海康网络相机初始化
->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
赵4老师 2012-02-17
  • 打赏
  • 举报
回复
前提是确认pbuffer里面的原始数据是彩色而不是灰度的。
赵4老师 2012-02-17
  • 打赏
  • 举报
回复
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); //只是创建空间,并不会初始化空间内的数据
赵4老师 2012-02-16
  • 打赏
  • 举报
回复
该不会你摄像头驱动临时设置为灰度模式了吧。
为什么不直接用
capture=cvCaptureFromCAM(...
IplImage* iplImg=cvQueryFrame(capture);

quwei197874 2012-02-16
  • 打赏
  • 举报
回复
得调哪个api,楼主搜搜吧
无0_0名 2012-02-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhao4zhong1 的回复:]
不知道用cvCaptureFromCAM能不能直接操作网络摄像机。
[/Quote]

SORRY,下午想回复您,但服务器升级,一直点不了
您说的方法不可取,cvCaptureFromCAM是从本机读取驱动的方式,网络相机驱动是不存在本机的,所以您的方法不能用,而且我也试过,我机器不光连着网络摄像机,同时也连着USB相机,您说的方法只能调取USB相机
赵4老师 2012-02-16
  • 打赏
  • 举报
回复
不知道用cvCaptureFromCAM能不能直接操作网络摄像机。
无0_0名 2012-02-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]
该不会你摄像头驱动临时设置为灰度模式了吧。
为什么不直接用
capture=cvCaptureFromCAM(...
IplImage* iplImg=cvQueryFrame(capture);

[/Quote]

我的是网络摄像机,不需要驱动,只需要IP,登录名,密码,端口号这些,我用正常SDK的方法可以显示,可我需要使用OPENCV进行处理,现在读到OPENCV中直接变成灰度图了,没法取像素

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧