关于内存中的图像使用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);
...全文
362 14 打赏 收藏 转发到动态 举报
写回复
用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中直接变成灰度图了,没法取像素
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目图像处理项目,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  

3,881

社区成员

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

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