ILD

opencv default is BGR
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2025-11-11 站点:Inside Linux Development

最近在使用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


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.