使用 poppler 中的灰度图像数据构造 opencv cv::Mat 时失败

Failed when construct opencv cv::Mat using data of a gray image in poppler

使用poppler::image::format_gray8时,由于内存访问冲突而崩溃

poppler::page * page = poppler_pdf_doc->create_page(page_index);
poppler::page_renderer page_render;
page_render.set_image_format(poppler::image::format_gray8);
poppler::image poppler_img = page_render.render_page(page, 120, 120);
cv::Mat(poppler_img.height(), poppler_img.width(), CV_8UC1, poppler_img.data(), poppler_img.bytes_per_row()).copyTo(__cv_mat_page);

但是用poppler::image::format_rgb24就可以了

poppler::page * page = __poppler_pdf_doc->create_page(page_index);
poppler::page_renderer page_render;
page_render.set_image_format(poppler::image::format_rgb24);
poppler::image poppler_img = page_render.render_page(page, 120, 120);
cv::Mat(poppler_img.height(), poppler_img.width(), CV_8UC3, poppler_img.data(), poppler_img.bytes_per_row()).copyTo(__cv_mat_page);

为什么?

顺便说一句,有什么简单的方法可以将格式 poppler::image::format_mono(每像素 1 位)转换为 cv::Mat

poppler 的单色图像是每像素 1 位,而 opencv 的是每像素 1 字节。