关于RGB转HSv出错 图片几乎全红

我干过豪哥 2013-10-01 07:14:14
图片出错成这样
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)




void cvtcolorRGB2HSV(unsigned char *src,unsigned char *dst,int width,int height)//,int widthstep)
{ int LineByte = WIDTHBYTES(width*3*8);
float min,max;
float b,g,r;
float h,s,v;
float delta;
for( int i = 0;i < height;i++)
{
//cout<<endl;
for(int j = 0;j < width;j++)
{
b = (float)src[i*LineByte + j*3+0];
g = (float)src[i*LineByte + j*3+1];
r = (float)src[i*LineByte + j*3+2];


min = MIN( r, g);
min = MIN(min, b);
max = MAX( r, g);
max = MAX(max, b);

v = max;
delta = max -min;

if( max != 0 )
{
s = delta / max;
}
else
{
s = 0;
h = -1;
dst[i*LineByte+j*3 + 0] = (unsigned char)h;
dst[i*LineByte+j*3 + 1] = (unsigned char)s;
dst[i*LineByte+j*3 + 2] = (unsigned char)v;
return ;
}
if( r == max )
{
h = (g - b)/ delta;
}
else if(g = max)
{
h = 2 + (b - r)/delta;
}
else
{
h = 4 + (r - g)/delta;
}
h *= 60;

if( h < 0 )
{
h += 360;
}
dst[i*LineByte + j*3 + 0] = (unsigned char)h;
dst[i*LineByte + j*3 + 1] = (unsigned char)s;
dst[i*LineByte + j*3 + 2] = (unsigned char)v;

}
}
}

int main(int argc,char *argv[])
{
IplImage *temp = cvLoadImage("lena.bmp",1);
IplImage *temp1 = cvCreateImage(cvGetSize(temp),temp->depth,temp->nChannels);

unsigned char *src = (unsigned char *)(temp->imageData);
unsigned char *dst = (unsigned char *)(temp1->imageData);
int Width = temp->width;
int Height = temp->height;


cvtcolorRGB2HSV(src,dst,temp->width,temp->height);

cvNamedWindow("1");
cvShowImage("1",temp1);
cvWaitKey(0);
return 0;
}

用这个程序出来的图片 几乎全红 与用opencv中自带装换的图片完全不一样 是hsv的排列存储顺序的问题么 求大大指点
...全文
403 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
coldleaf 2016-05-09
  • 打赏
  • 举报
回复
你要修改图像头信息,光改值不行,它还是BGR格式的。
黄晃晃亚亚 2016-05-06
  • 打赏
  • 举报
回复
你好,我在进行转换时也出现这个问题了,请问你有好的解决办法么?
MZstudio2012 2013-10-08
  • 打赏
  • 举报
回复
RGB-->HSV色彩模式值的转换方式如下: var_R = ( R / 255 ) //RGB from 0 to 255 var_G = ( G / 255 ) var_B = ( B / 255 ) var_Min = min( var_R, var_G, var_B ) //Min. value of RGB var_Max = max( var_R, var_G, var_B ) //Max. value of RGB del_Max = var_Max - var_Min //Delta RGB value V = var_Max if ( del_Max == 0 ) //This is a gray, no chroma... { H = 0 //HSV results from 0 to 1 S = 0 } else //Chromatic data... { S = del_Max / var_Max del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max if ( var_R == var_Max ) H = del_B - del_G else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R if ( H < 0 ) ; H += 1 if ( H > 1 ) ; H -= 1 } 希望对你有所帮助
我干过豪哥 2013-10-07
  • 打赏
  • 举报
回复
自己顶一下

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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