Я использовал imread, чтобы загрузить изображение с диска (я думал, что BGR — это вывод по умолчанию для cv :: imread). Затем я использовал cvtcolor для преобразования изображения из BGR (по умолчанию OpenCV) в RGBA (по умолчанию CUDA).
Я подумал, что должен убедиться, что изображение было преобразовано правильно, чтобы я отобразил (и сохранил) преобразованное изображение. Однако цвета изображения были искажены & выглядело синевато, когда я использовал imshow & imwrite. В целях отладки я попытался отменить преобразование в изображение debugImage & на удивление это отображалось правильно.
cv::Mat image;
image = cv::imread("input_image.jpg", CV_LOAD_IMAGE_COLOR);
if (image.empty()) {
std::cerr << "Couldn't open file: " << filename << std::endl;
exit(1);
}
int type1 = image.type(); //16 --> CV_8UC3
cv::namedWindow("image window", cv::WINDOW_AUTOSIZE);
cv::imshow("image window", image);
cv::waitKey(0);
cv::destroyWindow("image window");
cv::Mat imageRGBA1(image.rows, image.cols, CV_8UC4);
cv::cvtColor(image, imageRGBA1, CV_BGR2RGBA); // BGR2RGBA DIDNOT WORKED!!
int type2 = imageRGBA1.type(); // 24 --> CV_8UC4
cv::namedWindow("imageRGBA1 window", cv::WINDOW_AUTOSIZE);
cv::imshow("imageRGBA1 window", imageRGBA1); // BLUISH IMAGE
cv::waitKey(0);
cv::destroyWindow("imageRGBA1 window");
cv::Mat debugImage(image.rows, image.cols, CV_8UC4);
cv::cvtColor(imageRGBA1, debugImage, CV_RGBA2BGR);
int debugtype = debugImage.type(); // 24 --> CV_8UC4
cv::namedWindow("debugImage window", cv::WINDOW_AUTOSIZE);
cv::imshow("debugImage window", debugImage); // CORRECT IMAGE
cv::waitKey(0);
cv::destroyWindow("debugImage window");
Когда я предполагаю, что изображение, полученное из imread, было изображением RGB, преобразование работает:
cv::Mat image;
image = cv::imread("input_image.jpg", CV_LOAD_IMAGE_COLOR);
if (image.empty()) {
std::cerr << "Couldn't open file: " << filename << std::endl;
exit(1);
}
int type1 = image.type(); //16 --> CV_8UC3
cv::namedWindow("image window", cv::WINDOW_AUTOSIZE);
cv::imshow("image window", image);
cv::waitKey(0);
cv::destroyWindow("image window");
cv::Mat imageRGBA1(image.rows, image.cols, CV_8UC4);
cv::cvtColor(image, imageRGBA1, CV_RGB2RGBA); // CV_RGB2RGBA WORKED!!
int type2 = imageRGBA1.type(); // 24 --> CV_8UC4
cv::namedWindow("imageRGBA1 window", cv::WINDOW_AUTOSIZE);
cv::imshow("imageRGBA1 window", imageRGBA1); // CORRECT IMAGE
cv::waitKey(0);
cv::destroyWindow("imageRGBA1 window");
что мне не хватает?
Задача ещё не решена.
Других решений пока нет …