【发布时间】:2020-02-13 10:01:52
【问题描述】:
我正在从磁盘读取位图文件,并在经过一些操作后将副本写回磁盘,同时也写入原始文件的副本。位图相对较小,分辨率为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。在被卡住的糟糕情况下,我看到的最后一件事是“写入文件”,然后就什么也没有了。只需调整输入图像的大小,我就可以在好情况和坏情况之间来回切换。
有什么办法可以解决这个问题吗?
【问题讨论】:
-
OpenCV 很难处理分辨率不是 8 倍数的图像。但 30 不是 :D 但至少是偶数。我认为 31 对于 OpenCV 来说可能太小而且太具体了。我遇到过类似的问题,我使用 IPLimages 和他们一起延迟并硬设置他们的
image.aligmnet -
result、width和height是如何分配的。请分享整个代码!!! -
你一定要用BMP格式的文件吗?它们确实是一个糟糕的选择,因为 Microsoft 从未发布过明确的、明确的规范,而且它们不节省空间并且不支持 16 位数据。