Warm tip: This article is reproduced from serverfault.com, please click

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

发布于 2020-11-26 09:21:48

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?

Questioner
followait
Viewed
0
followait 2020-11-28 18:39:12

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