Search code examples
opencvpoppler

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


When using poppler::image::format_gray8, it crashes due to memory access violation

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);

But using poppler::image::format_rgb24, it's ok

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);

Why?

BTW, any easy way to convert format poppler::image::format_mono(1 bit per pixel) to cv::Mat?


Solution

  • poppler's mono image is 1 bit per pixel, and opencv's is 1 byte per pixel.