前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV 3.1 imwrite()函数写入异常问题解决方法

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

作者头像
chaibubble
发布2018-01-02 10:07:19
3.4K0
发布2018-01-02 10:07:19
举报

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

代码语言:javascript
复制
#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()的定义可以看到一个官方给出的例子:

代码语言:javascript
复制
 #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文件中都有很详细的介绍。

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

代码语言:javascript
复制
#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参数本身就带默认值。这个问题我也没有弄明白,弄懂后在更新出来。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档