如何获取BMP图像每点RGB颜色值

tangsave 2010-08-07 11:56:35
不用GetPixel函数,效率太低。

看了下BMP图原理,读取了BMP图数据,每一个像素位对应一个颜色索引号
如果这样,用这个索引找颜色,应该效率会高些。但不会实现方法。

还有就是不理解几个地方,其它我要实现的功能是。从摄像头读出一帧图像,图像是一个圆。我要识别出这个圆。
没必要生成BMP图像,应该获取摄像头数据时就可以开始取出RGB颜色。我想是这样。。。

从摄像头用一段代码得到这个值,我在网上找的代码是。

SetDlgItemText(IDC_STATIC1,_T(""));
typedef struct PINGPONG_PR
{
unsigned int rgb_address; //RGB信息的内存地址
unsigned char flag; //读标志位
}
PINGPONG_PR;

PINGPONG_PR image; //定义结构体用于存RGB图像地址;
DeviceIoControl(hCam,CAM_IOCTL_SAMSUNG_CAM_PR,NULL,NULL,(PBYTE)&image,NULL,NULL,NULL);

//////将内存地址中的数据保存
WORD width=GetSystemMetrics(SM_CYSCREEN);
WORD height=GetSystemMetrics(SM_CXSCREEN);//屏幕尺寸

BYTE* DDBdata=new BYTE[width*height*2];//分配用于存数据的空间
BYTE* DIBdata;
memcpy(DDBdata,(void *)image.rgb_address,width*height*2);//将这帧图像数据存入内存

然后用生成BMP的代码就可以生成拍下的图片。
那意思说 DDBdata 里就有我想要的颜色信息。

能不能从这里下手要RGB值。。。。

求高手指教~~~~~~~~~
...全文
1214 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangmingaa 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
对于HBITMAP位图是有办法的。
假设要处理的位图是HBITMAP hBitmap;
代码如下:
CBitmap m;
m.FromHandle(hBitmap);
BITMAP bt;
GetObject(sizeof(bt),&bt);
unsigned char *px=new unsigned char [bt.bmHeight*bt.bmbmWidthBytes]……
[/Quote]
这个bt与CBitmap的m怎么联系起来的呢
yinghuashihun 2010-10-06
  • 打赏
  • 举报
回复
摄像头捕获视频,应该有获得视频数据的函数,得到数据中之后,再利用圆的识别算法,应该不是很难,以前试验室里作为识别圆的算法,不过当时的算法做的是图片,识别率还可以的
guoln1010 2010-08-09
  • 打赏
  • 举报
回复
还是不懂
leechrockgames 2010-08-08
  • 打赏
  • 举报
回复
[code=C/C++]
void ENobject3D::LHxxSET_3DTEXALPHA(char *Tname,int alpha)
{
D3DLOCKED_RECT stLockedRect;
LPDIRECT3DTEXTURE9* ppTexture=NULL;
UCHAR *AlphaData=NULL;
int w=0;
int h=0;
TList=ENobject3DListOb.GetNode(Tname);
LHxx3DOBJECT *ob=TList->ObjectData;
for(int i=0;i<ob->LHxx3DTexATMaxFrame;i++)
{
ppTexture=&ob->LHxx3DTexAT[i].LHxxATTexture;
w=ob->LHxx3DTexATRw;
h=ob->LHxx3DTexATRh;
AlphaData=ob->LHxx3DTexAT[i].LHxxAlphaData;
(*ppTexture)->LockRect( 0, &stLockedRect, 0, 0 );
UCHAR *pch=(UCHAR *)stLockedRect.pBits;//只能获得alpha大小,不能获取值
// AlphaData=pch;
for (int j=0;j<h;j++)
{
for (int i=0;i<w;i++)
{
//设置纯黑alpha值
if(pch[0]==0 && pch[1]==0 && pch[2]==0)
{
pch[3]=0;
}
else
{
pch[3]=AlphaData[i+j*w];
int temp=alpha;
if(temp>0 && temp<256)
{
pch[3]=temp;
}
else if(temp>0 && temp>255)
{
pch[3]=255;
}
else
{
pch[3]=0;
}
}
AlphaData[i+j*w]=pch[3];
pch+=4;
}
}
(*ppTexture)->UnlockRect(0);
}
}
[C/C++]
leechrockgames 2010-08-08
  • 打赏
  • 举报
回复
[code=C/C++]
void ENobject3D::LHxxSET_3DTEXALPHA(char *Tname,int alpha)
{
D3DLOCKED_RECT stLockedRect;
LPDIRECT3DTEXTURE9* ppTexture=NULL;
UCHAR *AlphaData=NULL;
int w=0;
int h=0;
TList=ENobject3DListOb.GetNode(Tname);
LHxx3DOBJECT *ob=TList->ObjectData;
for(int i=0;i<ob->LHxx3DTexATMaxFrame;i++)
{
ppTexture=&ob->LHxx3DTexAT[i].LHxxATTexture;
w=ob->LHxx3DTexATRw;
h=ob->LHxx3DTexATRh;
AlphaData=ob->LHxx3DTexAT[i].LHxxAlphaData;
(*ppTexture)->LockRect( 0, &stLockedRect, 0, 0 );
UCHAR *pch=(UCHAR *)stLockedRect.pBits;//只能获得alpha大小,不能获取值
// AlphaData=pch;
for (int j=0;j<h;j++)
{
for (int i=0;i<w;i++)
{
//设置纯黑alpha值
if(pch[0]==0 && pch[1]==0 && pch[2]==0)
{
pch[3]=0;
}
else
{
pch[3]=AlphaData[i+j*w];
int temp=alpha;
if(temp>0 && temp<256)
{
pch[3]=temp;
}
else if(temp>0 && temp>255)
{
pch[3]=255;
}
else
{
pch[3]=0;
}
}
AlphaData[i+j*w]=pch[3];
pch+=4;
}
}
(*ppTexture)->UnlockRect(0);
}
}
[/C/C++]
weirdman 2010-08-08
  • 打赏
  • 举报
回复
用getRValue函数
wltg2001 2010-08-07
  • 打赏
  • 举报
回复
对于HBITMAP位图是有办法的。
假设要处理的位图是HBITMAP hBitmap;
代码如下:
CBitmap m;
m.FromHandle(hBitmap);
BITMAP bt;
GetObject(sizeof(bt),&bt);
unsigned char *px=new unsigned char [bt.bmHeight*bt.bmbmWidthBytes];
m.GetBitmapBits(bt.bmHeight*bt.bmbmWidthBytes,px);//读取位图数据
int PixelBytes=bt.bmBitsPixel/8;//每一个像素占字节数
int rgb_b;
for(y=0;y<bt.bmHeight;y++)
for(x=0;i<bt.bmWidth;x++)
{
rgg_b=y*bt.bmWidthBytes+x*PixelBytes;
px[rgb_b+0]
px[rgb_b+1]
px[rgb_b+2]//以上三个值就分别是BGR三个色彩的值。
}
zhoujk 2010-08-07
  • 打赏
  • 举报
回复
到我的空间去下载一个整数数组与位图的转换函数

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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