OpenCV 3.1 imwrite()函数写入异常问题解决方法

最近配置了OpenCV3.1版本,按照2.x的习惯写了一个保存图片的代码(测试证明该代码在2.4.11下运行正常),但是在使用imwrite()函数的时候出现了异常。 代码如下:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    Mat SrcImage = imread("1.jpg");
    imwrite("读入的图片.png", SrcImage);
    imshow("原图", SrcImage);
    waitKey(0);
    return 0;
}

只是很简单的读入一个图片然后再保存它。运行后异常如下:

修改办法: 1.是将debug模式修改为Release,代码不用修改的情况下即可正常运行。 2.将imwrite()函数写入第三个参数,我们查看imwrite()的定义可以看到一个官方给出的例子:

 #include <opencv2/opencv.hpp>

    using namespace cv;
    using namespace std;

    void createAlphaMat(Mat &mat)
    {
        CV_Assert(mat.channels() == 4);
        for (int i = 0; i < mat.rows; ++i) {
            for (int j = 0; j < mat.cols; ++j) {
                Vec4b& bgra = mat.at<Vec4b>(i, j);
                bgra[0] = UCHAR_MAX; // Blue
                bgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green
                bgra[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Red
                bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha
            }
        }
    }

    int main(int argv, char **argc)
    {
        // Create mat with alpha channel
        Mat mat(480, 640, CV_8UC4);
        createAlphaMat(mat);

        vector<int> compression_params;
   compression_params.push_back(IMWRITE_PNG_COMPRESSION);
   compression_params.push_back(9);

        try {
            imwrite("alpha.png", mat, compression_params);
        }
        catch (cv::Exception& ex) {
            fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
            return 1;
        }

        fprintf(stdout, "Saved PNG file with alpha data.\n");
        return 0;
    }

IMWRITE_PNG_COMPRESSION 为对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9。较高的值意味着更小的尺寸和更长的压缩时间,而默认值是3。 所以上述程序中选择了压缩级别为9。除此之外OpenCV还提供了很多种其他的保存格式,在转到定义后的imgcodecs.hpp文件中都有很详细的介绍。

所以 我们只需要简单改写代码,即可解决异常问题。

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    Mat SrcImage = imread("1.jpg");
    vector<int> compression_params;
    compression_params.push_back(IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);
    imwrite("读入的图片.png", SrcImage, compression_params);
    imshow("原图", SrcImage);
    waitKey(0);
    return 0;
}

最后,用以上两种办法都解决了异常,但是异常产生的原因是什么,为什么这样做就没有异常了,尤其是params参数本身就带默认值。这个问题我也没有弄明白,弄懂后在更新出来。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信技能树

生物信息学技能面试题(第4题)-多个同样的行列式文件合并起来

相信用过htseq-count的朋友都知道,它是分开对每个样本计算所有的基因表达量,所以会生成一个个独立的文件,我用perl脚本模仿它的结果如下: $ head...

3007
来自专栏菩提树下的杨过

Flash/Flex学习笔记(17):按键捕获

先来看简单的单个按键捕获: package { import flash.display.Sprite; import fl.controls.Label...

2049
来自专栏AI科技大本营的专栏

实战 | 手把手教你用苹果CoreML实现iPhone的目标识别

在WWDC 2017上,苹果首次公布了机器学习方面的动作。iOS系统早已支持Machine Learning 和 Computer Vision ,但这次苹果提...

5158
来自专栏数值分析与有限元编程

导出ANSYS模型的数据

在计算过程中,通常需要对计算结果进行统计,ANSYS计算的模型大多时候节点单元数目很多,结果数据也很多,因此在GUI界面的查询操作不太方便,工作量太大,而且结果...

2965
来自专栏我和未来有约会

《天弋夺宝》—01飞船的控制

《天弋夺宝》—01飞船的控制 作飞船类的小游戏首先需要控制飞船。 设置场景为30.fps。在场景内绘制一个飞船的MC。取名ship_mc ? 在场景内最上层第...

1907
来自专栏云计算教程系列

如何在Ubuntu 14.04第1部分上查询Prometheus

Prometheus是一个开源监控系统和时间序列数据库。Prometheus最重要的一个方面是它的多维数据模型以及随附的查询语言。此查询语言允许您对维度数据进行...

420
来自专栏前端说吧

前端切图-PhotoShop软件使用教程(png+jpg格式图片)

部分看了文章的设计师,来找我说怎么切图。sorry?在我的理解,这就是切图啊,但是他们所指的“切图”是,怎么把设计图制作成html页面。

19810
来自专栏Windows Community

Windows Community Toolkit 3.0 - UniformGrid

UniformGrid 控件是一个响应式的布局控件,允许把 items 排列在一组均匀分布的行或列中,以填充整体的可用显示空间,形成均匀的多个网格。默认情况下,...

782
来自专栏hrscy

在unity中使用三种简单的方式实现实时时钟动画

在 unity 中,材质是用来给一个对象的细节,所以我们可以决定它会看起来像什么。在大多数情况下,材料将以纹理为参数。

1022
来自专栏ml

初学java之常用组件

1 2 import javax.swing.*; 3 4 import java.awt.*; 5 class Win extend...

2324

扫码关注云+社区