【发布时间】:2012-07-23 20:53:37
【问题描述】:
我正在编写一个小程序来将 OpenInventor 文件转换为 PCD 文件。为此,我输入了两个文件,即 OpenInventor 文件和 JPEG 图像。纹理坐标是介于 0.0 和 1.0 之间的浮点值。
我使用OpenCV提取RGB值并以十进制格式返回,但是下面的函数好像不能正常工作...
float get_color(cv::Mat img, float x, float y) {
int i = x*img.cols;
int j = y*img.rows;
unsigned char R = img.ptr<unsigned char>(j)[3*i];
unsigned char G = img.ptr<unsigned char>(j)[3*i+1];
unsigned char B = img.ptr<unsigned char>(j)[3*i+2];
return R*pow(16,4) +
G*pow(16,2) +
B;
}
我加载图像
cv::imread("filename.jpg", CV_LOAD_IMAGE_COLOR).
【问题讨论】:
-
你怎么可能用一个
float来表示一种RGB颜色? -
@DesmondHume:完全是我的想法。
-
你想用那个浮动做什么?您是否可能想要一个平均值以获得灰度图像?
-
其实一个浮点数可以存储3个字节。浮点数为 32 位,尾数为 24 位。其中只有 23 个被实际存储,但这并不重要,因为由于浮点数的原因,第一位总是 1。所以,如果你用 8 位值表示 R、G 和 B,只需使用类似 256 的值*256*R+256*G+B 可以解决问题,并且应该是完全可逆的。不过,为什么有人会使用浮点数而不是 int 我无法理解
-
@DesmondHume,是的,我想我在计算 B 时打错了。无论如何,B 是 150。我的意思是,反过来很简单,我不明白你的反对意见是什么!
标签: c++ opencv rgb point-cloud-library openinventor