为什么BMP图像上的文字卡住/不返回?

问题描述 投票:0回答:1

我正在从磁盘读取位图文件,并在进行一些操作后将副本写回到磁盘,还写入了原始文件的副本。位图相对较小,分辨率为31 x 31像素。

[我看到的是,当我具有30 x 30像素的分辨率时,cv::imwrite正确地写出文件,但是,如果我追求31 x 31像素的分辨率,则cv:imwrite只会卡住并且不会返回。这是在同一目录上发生的。

<...>
image = cv::imread(imageName, IMREAD_GRAYSCALE); // Read the file
if( image.empty() )                      // Check for invalid input
{
    cout <<  "Could not open or find the image" << std::endl ;
    return -1;
}
Mat image_flip (width,height,CV_8U);

int8_t pixel_8b;
for (int i=0; i< width; i++){
    for (int j=0; j < height; j++){
        pixel_8b= image.at<int8_t>(i,j);
        image_flip.at<int8_t>(width-i,j) = pixel_8b;
    }
}
cout << "Writing files" << endl;
result=cv::imwrite("./output_flip.bmp", image_flip);

cout << result << endl;
return 0;

[在好的情况下,我将文件output_flip.bmp写入磁盘,并显示result。在卡住的糟糕情况下,我看到的最后一件事是“写入文件”,然后什么也没有了。我可以通过调整输入图像的大小来在好与坏情况之间来回切换。

任何想法如何解决该问题?

c++ opencv bitmap
1个回答
2
投票

正如评论中已经讨论的,您没有提供minimal, reproducible example(MRE)。因此,我从您的代码派生出以下MRE,因为我想指出几件事(想知道您的代码如何工作):

#include <opencv.hpp>

int main()
{
    cv::Mat image = cv::imread("path/to/your/image.png", cv::IMREAD_GRAYSCALE);

    // cv::resize(image, image, cv::Size(30, 30));

    cv::Mat image_flip(image.size().height, image.size().width, CV_8U);

    for (int i = 0; i < image.size().width; i++) 
    {
        for (int j = 0; j < image.size().height; j++) 
        {
            const uint8_t pixel_8b = image.at<uint8_t>(j, i);
            image_flip.at<uint8_t>(j, image.size().width - 1 - i) = pixel_8b;
        }
    }

    std::cout << "Writing files" << std::endl;
    const bool result = cv::imwrite("./output_flip.bmp", image_flip);

    std::cout << result << std::endl;

    return 0;
}
  • 对于单通道8位图像(CV_8U),访问单个像素时使用uint8_t
  • [使用.at时,请注意,语法为.at(y, x)。对于正方形图像,它可能是相等的,但是通常,它是错误的常见来源。
  • .at(j, width-i)的最后一个索引是i = 0,因此[width = image.size().width的访问image必须失败,如果是width - 1
  • 更正了这些问题之后,对于较大的图像,以及将图像的大小调整为30 x 3031 x 31,我都可以运行您的代码而没有问题。因此,如果您可以通过相应地修改代码来解决问题,请看一下。

    ((我知道,问题(挂起imwrite)中所述的实际问题在我的答案中根本没有解决,但是正如我所说,我什至无法运行所提供的代码...)

    希望有帮助!

  • © www.soinside.com 2019 - 2024. All rights reserved.