MFC 大恒相机 如何利用ConvertBayer2Rgb获取图像某一点的RGB值

Flandre 2014-01-10 01:31:07
MFC中,大恒相机,函数ConvertBayer2Rgb

函数申明为
void __stdcall ConvertBayer2Rgb(BYTE *pDest,BYTE *pSrce, int nWid,int nHei,HV_BAYER_CONVERT_TYPE cvtype,BYTE* pLutR,BYTE* pLutG, BYTE* pLutB,bool bFlip,HV_BAYER_LAYOUT Layout);
参数
/*
\brief bayer图像转换成RGB图像函数
\param pDest [out]数据输出buffer指针(24位RGB图像)
\param pSrce [in]数据输入buffer指针(8位Raw图像)
\param nWid [in]图像宽
\param nHei [in]图像高
\param cvtype [in]插值算法类型
\param pLutR [in]R分量数字增益查找表
\param pLutG [in]G分量数字增益查找表
\param pLutB [in]B分量数字增益查找表
\param bFlip [in]图像翻转标记 true:翻转 false:不翻转
\param Layout [in]bayer类型
return void
*/
//--------------------------------------------------

定义函数
ConvertBayer2Rgb(m_pImageBuffer,m_pRawBuffer,Width,Height,ConvertType,
m_pLutR,m_pLutG,m_pLutB,true,m_Layout);

BYTE m_pLutR[256] ;
BYTE m_pLutG[256] ;
BYTE m_pLutB[256] ;

for(int i=0;i<256;i++)
{
m_pLutR[i] = i;
m_pLutG[i] = i;
m_pLutB[i] = i;
}


请问如何利用该函数分辨出图像某一区域偏于白色还是偏于蓝色,或者如何获得某一点的R值G值B值?m_pLutR,m_pLutG,m_pLutB这三个能转换成RGB数值吗
...全文
883 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsw3106 2014-12-31
  • 打赏
  • 举报
回复
楼主你好,求助,我也在用大恒相机,现在牵扯一个图像处理的过程,程序里是这样写的*(m_pImageBuffer+j*600*3+(i*4+1)*3)=*(m_pImageBuffer+j*600*3+i*4*3); 请问你知道这是什么意思吗?如何变换的我了解,只是不知道这种m_pImageBuffer+j*600*3+(i*4+1)*3形式是什么意思,看楼上说的RGB格式图像在内存中是如何存储的问题,*(首指针+行数*每行长度+列数*3+分量号)。望能解答,多谢
andong133 2014-05-30
  • 打赏
  • 举报
回复
其实就是按BGR在内存中排列的。
Flandre 2014-05-20
  • 打赏
  • 举报
回复
引用 11 楼 andong133 的回复:
请问楼主找到获取每点RGB值的方法了吗?
没有,我已经放弃了...
andong133 2014-05-07
  • 打赏
  • 举报
回复
请问楼主找到获取每点RGB值的方法了吗?
andong133 2014-05-06
  • 打赏
  • 举报
回复
引用 6 楼 baichi4141 的回复:
[quote=引用 5 楼 flydreamGG 的回复:] 当中的m_pImageBuffer就是你的RGB数据啊,只不过这个是24位的,你需要隔3个字节取一次数据就是对应的R(或B或G)值。 我也在用大恒的相机,说实话我特别不喜欢这个ConvertBayer2Rgb函数,其实数据我已经取到了,只不过是raw数据,用这个函数只不过是转成RGB模式的。明明我是8位的,非得给我转成24位的,增加了我处理的时间,害的我还要再转成8位的。我要是弄清楚了你那个什么layer数据的格式,我不会用你这个垃圾函数!
“明明我已经得到了很小的压缩文件,非得给我解压成很大的文件,增加了我处理的时间,害得我还要从中选一部分复制出来。我要是弄清楚了你那个什么压缩算法,我才不会用你这个垃圾压缩软件!” Bayer数据格式非常简单,每个字节代表RGB之一,相邻字节代表不同颜色,转换成彩色图像就是各颜色分别插值而已。 ConvertBayer2Rgb函数也完全可以不用,这是开发人员为了不让用户浪费时间自己写代码而提供的函数,你非要自己写那也无所谓。不过最小运算量是相同的,就算你只想要8位灰度图像,自己写转换函数也不过就是节省点内存而已——可能还要增加运算时间,所谓以时间换空间么。当然,如果这个函数的内部实现效率太低,那自己写或许是个好主意,不过没有源代码也懒得反汇编,就不清楚内部实现如何了。[/quote] 我现在想要的就是Bayer数据格式转换为8位灰度图像,请问怎么做?需要自己写代码吗,大恒有没有现成的函数?谢谢
Flandre 2014-01-20
  • 打赏
  • 举报
回复
引用 4 楼 baichi4141 的回复:
楼主现在需要做的,是去了解RGB格式图像在内存中是如何存储的,而不是希望有一个函数能帮你做任何事情
*(首指针+行数*每行长度+列数*3+分量号),就这么简单


你说的那个*(首指针+行数*每行长度+列数*3+分量号)具体是什么意思,干嘛用的?

我程序中有一段代码不太明白是什么意思,不知道和你这个有没有关系

for(row=0;row<Rect;row++)
for(column=0;column<Rect;column++) //Rect=20
{
temp=((Height-y-row)*Width+x+column)*3;
if((*(m_pImageBuffer+temp)>= 100) && (*(m_pImageBuffer+temp+1)>= 200) && (*(m_pImageBuffer+temp+2)>= 200))
{
iCount++;
}
}
//Height(480)和Width(640)是图像的高和宽,x=FirstX + column * offetx; y=FirstY + row * offetx


附上图片,代码应该是想检测图中白色亮点部分,*(m_pImageBuffer+temp)到底是什么意思?
。。。图片传不上来,就是有一张图,中间规则排列着N×N个白色大圆点,每个大圆点之间的上下距离用offsety表示,左右距离用offsetx表示,第一个点左上角作为FirstX,Y ,大圆点外面套了个正方形(相切),正方形边长为rect
Flandre 2014-01-20
  • 打赏
  • 举报
回复
引用 5 楼 flydreamGG 的回复:
当中的m_pImageBuffer就是你的RGB数据啊,只不过这个是24位的,你需要隔3个字节取一次数据就是对应的R(或B或G)值。 我也在用大恒的相机,说实话我特别不喜欢这个ConvertBayer2Rgb函数,其实数据我已经取到了,只不过是raw数据,用这个函数只不过是转成RGB模式的。明明我是8位的,非得给我转成24位的,增加了我处理的时间,害的我还要再转成8位的。我要是弄清楚了你那个什么layer数据的格式,我不会用你这个垃圾函数!
那么比如说我现在有个宽10高10的图片,里面的像素点个数就是10×10=100个,每个点里面存了三个值分别是R值G值B值,是这个样子吗?这个m_pImageBuffer里面存的RGB数据要怎么拿出来用,比如我现在想要每个点的RGB值
for(int i=0;i<10;i++)
  for(int j=0;j<10;j++)
     R[i][j]=?m_pImageBuffer?
     G[i][j]=??m_pImageBuffer??
     B[i][j]=???m_pImageBuffer???
可以这样取得每个点的RGB值吗?
Flandre 2014-01-20
  • 打赏
  • 举报
回复
baichi4141 2014-01-16
  • 打赏
  • 举报
回复
引用 5 楼 flydreamGG 的回复:
当中的m_pImageBuffer就是你的RGB数据啊,只不过这个是24位的,你需要隔3个字节取一次数据就是对应的R(或B或G)值。 我也在用大恒的相机,说实话我特别不喜欢这个ConvertBayer2Rgb函数,其实数据我已经取到了,只不过是raw数据,用这个函数只不过是转成RGB模式的。明明我是8位的,非得给我转成24位的,增加了我处理的时间,害的我还要再转成8位的。我要是弄清楚了你那个什么layer数据的格式,我不会用你这个垃圾函数!
“明明我已经得到了很小的压缩文件,非得给我解压成很大的文件,增加了我处理的时间,害得我还要从中选一部分复制出来。我要是弄清楚了你那个什么压缩算法,我才不会用你这个垃圾压缩软件!” Bayer数据格式非常简单,每个字节代表RGB之一,相邻字节代表不同颜色,转换成彩色图像就是各颜色分别插值而已。 ConvertBayer2Rgb函数也完全可以不用,这是开发人员为了不让用户浪费时间自己写代码而提供的函数,你非要自己写那也无所谓。不过最小运算量是相同的,就算你只想要8位灰度图像,自己写转换函数也不过就是节省点内存而已——可能还要增加运算时间,所谓以时间换空间么。当然,如果这个函数的内部实现效率太低,那自己写或许是个好主意,不过没有源代码也懒得反汇编,就不清楚内部实现如何了。
昨夜无风 2014-01-14
  • 打赏
  • 举报
回复
当中的m_pImageBuffer就是你的RGB数据啊,只不过这个是24位的,你需要隔3个字节取一次数据就是对应的R(或B或G)值。 我也在用大恒的相机,说实话我特别不喜欢这个ConvertBayer2Rgb函数,其实数据我已经取到了,只不过是raw数据,用这个函数只不过是转成RGB模式的。明明我是8位的,非得给我转成24位的,增加了我处理的时间,害的我还要再转成8位的。我要是弄清楚了你那个什么layer数据的格式,我不会用你这个垃圾函数!
baichi4141 2014-01-14
  • 打赏
  • 举报
回复
楼主现在需要做的,是去了解RGB格式图像在内存中是如何存储的,而不是希望有一个函数能帮你做任何事情 *(首指针+行数*每行长度+列数*3+分量号),就这么简单
baichi4141 2014-01-14
  • 打赏
  • 举报
回复
ConvertBayer2Rgb的作用是把相机传回来的RAB格式图像数据转换为RGB格式,然后按照RGB格式找像素就行了 楼主的问题在于希望能有一个函数完成这两个功能,很遗憾这是不可能的,这种思路是用户的思路,不是程序员的思路,用户喜欢傻瓜式操作不用动脑一次OK,程序员喜欢把一个大功能拆分成一个个小功能随意组合调整
Flandre 2014-01-14
  • 打赏
  • 举报
回复
求救啊,有什么方法能区分颜色啊
Flandre 2014-01-10
  • 打赏
  • 举报
回复
如果那个函数做不到区分颜色的话,这边有个Raw2Rgb.h的头文件,里面包含好几个函数,我不太了解,请问有哪个函数可以做到区分颜色或者获取到某一点的RGB值吗
void __stdcall Raw12PackedToRaw16(BYTE* pInBuf, BYTE* pOutBuf,int iWidth, int iHeight);

void __stdcall Raw10PackedToRaw16(BYTE* pInBuf, BYTE* pOutBuf,int iWidth, int iHeight);

void __stdcall ROIColorCorrection( void *pImg, int roi_left, int roi_top, int roi_wid, int roi_hei, int nImgWid, int nImgHei);HVSTATUS __stdcall HVRotate90CW8B(const BYTE* pInputBuffer, int nWidth, int nHeight, BYTE* pOutputBuffer);

HVSTATUS __stdcall HVRotate90CCW8B(const BYTE* pInputBuffer, int nWidth, int nHeight, BYTE* pOutputBuffer);

HVSTATUS __stdcall HVBrightness(BYTE* pInputBuffer,int nImagesize, int nFactor,BYTE* pOutputBuffer);

HVSTATUS __stdcall HVContrast(BYTE* pInputBuffer,int nImagesize, int nFactor,BYTE* pOutputBuffer);

HVSTATUS __stdcall HVSharpen24B(BYTE* pInputBuffer,int nWidth,int nHeight,float factor,BYTE* pOutputBuffer);

HVSTATUS __stdcall HVSaturation(BYTE* pInputBuffer,int nImagesize, int nFactor,BYTE* pOutputBuffer);

void __stdcall ConvertBayer2Rgb(BYTE *pDest,BYTE *pSrce, int nWid,int nHei,HV_BAYER_CONVERT_TYPE cvtype,BYTE* pLutR,BYTE* pLutG, BYTE* pLutB,bool bFlip,HV_BAYER_LAYOUT Layout);

void __stdcall GetWhiteBalanceRatio(BYTE *pSrce,int nWid,int nHei,double* dRatioR,double* dRatioG,double* dRatioB);

void __stdcall SetGammaLut(BYTE pLutGamma[256],double dGammaRatio);

void __stdcall DetectDeadPixel(BYTE * pRawImgBuf,BYTE * pBadPixelPosBuf,int nImgWid,int nImgHei);

void __stdcall EraseDeadPixel(BYTE * pRawImgBuf,BYTE * pBadPixelPosBuf,int nXPos,int nYPos,int nImgWid,int nImgHei,int nBadPixelBufWid,int nBadPixelBufHei);

HVSTATUS __stdcall HVDetectRawDeadPos(BYTE *pRawImgBuf,BYTE *pBadPixelPosBuf,int nImgWid,int nImgHei,int nBitNum);

HVSTATUS __stdcall HVCorrectRawBadPos(BYTE *pRawImgBuf,BYTE *pBadPixelPosBuf,int nImgWid,int nImgHei,int nBitNum);

HVSTATUS __stdcall HVAutoRawDefectivePixelCorrect(BYTE *pRawImgBuf,int nImgWid,int nImgHei,int nBitNum);

void __stdcall GetPatternNoise(BYTE * pRawImgBuf,int * pPatternBuf,int nPatternWid,int nPatternHei);

void __stdcall AvgPatternNoise(int * pPatternBuf,int nPatternWid,int nPatternHei,int nAvgTimes);

void __stdcall FixPatternNoise(BYTE * pRawImgBuf,int * pPatternBuf,int nXPos,int nYPos,int nImgWid,int nImgHei,int nPatternWid,int nPatternHei);

void __stdcall SetBadPixelThreshold(int BadPixelThreshold);

void __stdcall HVConvert(HV_CONVERT_CODE ConvertCode, void *pContext, int *pLength);

19,468

社区成员

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

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