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

我从网络摄像机读取视频流,数据存储在char*pbuffer里,我想使用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);
上面问题没说清楚,IplImage * Img=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3);
取3通道的的方法我也试过,图像还是灰度,但这个灰度图是R==G==B.
海康网络相机初始化->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);
展开
 我来答
hydranjc
2012-02-16
知道答主
回答量:31
采纳率:0%
帮助的人:6.6万
展开全部
1.IplImage * Img=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
img是单通道的。8位跟24位图首先图像头就是不一样的,即时数据再变也是灰度图,除非重写图像头。
2.nYSize多大? 24位是nWidth * nHeight*3
缓存中的数据也没完全copy到img中吧
更多追问追答
追问
可能我没说清楚,IplImage * Img=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,3); 的方法我也试过,3通道的时候nYSize取的就是nWidth * nHeight*3 ,但图像还是灰度的
追答
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
IplImage* src;
if( (src=cvLoadImage("D:\\fruits.jpg", -1))!= 0)
{
cvNamedWindow("ori", 1);
IplImage *memimg = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
memcpy(memimg->imageData,src->imageData,src->width*src->height*3);
cvShowImage("ori", memimg);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&memimg);
cvDestroyWindow("ori");
}
printf("Hello World!\n");
return 0;
}
memcpy过来显然是彩图。
1.pBuffer中是什么东西,是什么格式编码的数据?jpeg?
2.你用的opencv是什么版本的,我的IplImage结构中没有Img->pBuffer指向的pBuffer这个东西
3.请将你的通道数改成3后,转换数据流及显示的代码贴一下 。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chensuchang
2012-02-16 · TA获得超过6399个赞
知道大有可为答主
回答量:6655
采纳率:50%
帮助的人:4931万
展开全部
IplImage * Img=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
img是单通道的,怎么可能是彩色?
追问
我当然知道Img是灰色的,我的意思是换种方法,可以创建一个3通道的图像,毕竟pBuffer里面是彩色图像
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jackone32123
2012-02-18 · TA获得超过441个赞
知道小有建树答主
回答量:327
采纳率:0%
帮助的人:279万
展开全部
你的 pFrameInfo 值是多少?你是不是截的时候就是灰度的?
追问
pFrameInfo所有值
// pFrameInfo->dwFrameNum = 帧数 // 图像帧数。
// pFrameInfo->nWidth = 352 // 画面宽,单位像素。
// pFrameInfo->nHeight = 288 // 画面高。
// pFrameInfo->nFrameRate = 25 // 编码时产生的图像帧率。
// pFrameInfo->nStamp = nStamp + x (x nType = 3 // 数据类型,T_YV12 == 3
用SDK自带方法显示,图像为彩色
追答
就是这里的问题了 

T_YV12 的格式肯定不是RGB,我估计应该是YUV,具体怎么排列的还要看他的文档。
既然单通道能显示黑白图像, 貌似应该是Y0Y1.... U0U1....V0V1 这种电视格式。

你要先搞清了格式,然后把yuv的data转换成rgb的,才能显示出来彩色。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式