我正在从磁盘读取位图文件,并在进行一些操作后将副本写回到磁盘,还写入了原始文件的副本。位图相对较小,分辨率为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
。在卡住的糟糕情况下,我看到的最后一件事是“写入文件”,然后什么也没有了。我可以通过调整输入图像的大小来在好与坏情况之间来回切换。
任何想法如何解决该问题?
正如评论中已经讨论的,您没有提供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;
}
CV_8U
),访问单个像素时使用uint8_t
。.at
时,请注意,语法为.at(y, x)
。对于正方形图像,它可能是相等的,但是通常,它是错误的常见来源。i = 0
,因此[width = image.size().width
的访问image
必须失败,如果是width - 1
。30 x 30
或31 x 31
,我都可以运行您的代码而没有问题。因此,如果您可以通过相应地修改代码来解决问题,请看一下。((我知道,问题(挂起imwrite
)中所述的实际问题在我的答案中根本没有解决,但是正如我所说,我什至无法运行所提供的代码...)
希望有帮助!