Opencv imshow Y из YUV

Я пытаюсь извлечь и отобразить

Канал Y из преобразованного изображения YUV

Мой код выглядит следующим образом:

Mat src, src_resized, src_gray;

src = imread("11.jpg", 1);

resize(src, src_resized, cvSize(400, 320));

cvtColor(src_resized, src_resized, cv::COLOR_BGR2RGB);

/*
I've tried both with and without the upper conversion 
(mentioned here as bug 
http://stackoverflow.com/questions/7954416/converting-yuv-into-bgr-or-rgb-in-opencv 
 in an opencv 2.4.* version - mine is 2.4.10 )
*/

cvtColor(src_resized, src_gray, CV_RGB2YUV); //YCrCb

vector<Mat> yuv_planes(3);
split(src_gray,yuv_planes);

Mat g, fin_img;

g = Mat::zeros(Size(src_gray.cols, src_gray.rows),0);

 // same result withg = Mat::zeros(Size(src_gray.cols, src_gray.rows), CV_8UC1);

vector<Mat> channels;

channels.push_back(yuv_planes[0]);
channels.push_back(g);
channels.push_back(g);

merge(channels, fin_img);

imshow("Y ", fin_img);

waitKey(0);

return 0;

В результате я ожидал серого изображения, показывающего люминесценцию.

Вместо этого я получаю изображение канала B/G/R в зависимости от положения (первого/второго/третьего)

channels.push_back(yuv_planes[0]);

как показано здесь: Результат

Что мне не хватает? (Я планирую использовать яркость для суммирования строк/столбцов и последующего извлечения номерного знака с использованием полученных данных)


person GodIsAnAstronaut    schedule 05.05.2016    source источник
comment
Не могли бы вы сделать отступ в своем коде разумным образом?   -  person Dan Mašek    schedule 06.05.2016
comment
Вместо этого я получаю изображение канала B/G/R, но вы явно создаете 3-канальное изображение, где вы устанавливаете один цветовой канал на яркость, а два других на ноль. Что еще, кроме красного, зеленого или синего цвета, вы ожидаете увидеть? Если вы хотите, чтобы он был в градациях серого, либо используйте одноканальное изображение, либо установите для всех трех компонентов RGB одинаковые значения.   -  person Dan Mašek    schedule 06.05.2016
comment
Ну, это было ужасно глупо и просто. Большое спасибо.   -  person GodIsAnAstronaut    schedule 06.05.2016


Ответы (1)


Проблема заключалась в отображении свечения только в одном канале вместо заполнения им всех каналов.

Если кто-то еще сталкивается с той же проблемой, просто измените

Mat g, fin_img;

g = Mat::zeros(Size(src_gray.cols, src_gray.rows),0);

vector<Mat> channels;

channels.push_back(yuv_planes[0]);
channels.push_back(g);
channels.push_back(g);

to (заполнить все каналы нужным каналом)

Mat  fin_img;

vector<Mat> channels;

channels.push_back(yuv_planes[0]);
channels.push_back(yuv_planes[0]);
channels.push_back(yuv_planes[0]);
person GodIsAnAstronaut    schedule 05.05.2016