Mat img = imread("lena512.bmp", 1); // Black and White Image
В этом проблема, комментарий - ложь, и используя магическое число вместо именованной константы, вы не можете легко сказать, что это так. 1
в этом контексте означает IMREAD_COLOR
- т.е. изображение всегда читается как 3-канальное изображение BGR.
Однако после махинаций с memcpy
и необработанными указателями вы создаете новый Mat
следующим образом:
Mat image = Mat(width, height , CV_8U);
Обратите внимание, что CV_8U
эквивалентно CV_8UC1
. Следовательно, вы создаете один канал (в градациях серого) Mat
, но передаете ему 3-канальные данные.
Получение мусора в результате - это меньшая проблема. Гораздо более серьезная проблема заключается в том, что вы копируете в 3 раза больше данных, чем может вместить буфер целевого пикселя - в основном вы забираете половину мегабайта памяти, которая не принадлежит Mat
. Это может закончиться либо сбоем, либо некоторыми действительно трудными для поиска ошибок (в случае перезаписи некоторой памяти, используемой другими структурами данных).
Обновление: Есть еще одна проблема, которую я пропустил (спасибо @Micka за это). Порядок параметров конструктора cv::Mat
- строки, столбцы, тип данных. Похоже, вы переключили ширину и высоту, хотя, поскольку ваше входное изображение выглядит квадратным (т.е. width == height
), это не имело значения.
Правильный способ выделить второе Mat
будет
Mat image = Mat(height, width, CV_8UC3);