最近在使用libraw读取原图。
static libraw_processed_image_t *
get_raw_image(int stderr_fd, const char *path)
{
LibRaw RawProcessor;
libraw_processed_image_t *image;
int ret;
ret = RawProcessor.open_file(path);
if (ret != LIBRAW_SUCCESS) {
dprintf(stderr_fd, "RawProcessor.open_file %s failed: %s\n", path, libraw_strerror(ret));
return NULL;
}
ret = RawProcessor.unpack();
if (ret != LIBRAW_SUCCESS) {
dprintf(stderr_fd, "RawProcessor.unpack %s failed: %s\n", path, libraw_strerror(ret));
return NULL;
}
ret = RawProcessor.dcraw_process();
if (ret != LIBRAW_SUCCESS) {
dprintf(stderr_fd, "RawProcessor.dcraw_process %s failed: %s\n", path, libraw_strerror(ret));
return NULL;
}
image = RawProcessor.dcraw_make_mem_image(&ret);
RawProcessor.recycle();
if (!image) {
dprintf(stderr_fd, "RawProcessor.dcraw_make_mem_image %s failed: %s\n", path, libraw_strerror(ret));
return NULL;
}
// swap RGB to opencv BGR
int i, j;
for (i = 0; i < image->width; i++) {
int k = i * (3 * image->height);
for (j = 0; j < image->height; j++) {
unsigned char tmp = image->data[k + 3 *j];
image->data[k + 3*j] = image->data[k + 3*j + 2];
image->data[k + 3*j + 2] = tmp;
}
}
return image;
}为了测试读取的像素点对不对,同一张raw图,用libraw的sample里面的samples/mem_image_sample.cpp工具,转成ppm后。
使用opencv读取。然后和libraw读取的图对比。
发现raw读出来:111 106 088
opencv读出来:088 106 111
搜索发现,原来opencv读取出来的是BGR格式。raw读取出来时RGB。
https://stackoverflow.com/questions/14556545/why-opencv-using-bgr-colour-space-instead-of-rgb