博客
关于我
OpenCV 3.1 imwrite()函数写入异常问题解决方法
阅读量:791 次
发布时间:2023-02-23

本文共 2309 字,大约阅读时间需要 7 分钟。

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

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

运行后异常如下:

修改办法:

  • 是将debug模式修改为Release,代码不用修改的情况下即可正常运行。

  • 将imwrite()函数写入第三个参数,我们查看imwrite()的定义可以看到一个官方给出的例子:

  • #include 
    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
    (i, j); bgra[0] = UCHAR_MAX; // Blue bgra[1] = saturate_cast
    ((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green bgra[2] = saturate_cast
    ((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Red bgra[3] = saturate_cast
    (0.5 * (bgra[1] + bgra[2])); // Alpha } }}int main(int argv, char **argc) { Mat mat(480, 640, CV_8UC4); createAlphaMat(mat); vector
    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 
    #include
    #include
    #include
    using namespace std;using namespace cv;int main() { Mat SrcImage = imread("1.jpg"); vector
    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参数本身就带默认值。这个问题我也没有弄明白,弄懂后在更新出来。

    转载地址:http://mosfk.baihongyu.com/

    你可能感兴趣的文章
    OC中关于给NSString 赋 nil和@""的区别
    查看>>
    OC字符串方法汇总
    查看>>
    OC学习6——面相对象的三大特性
    查看>>
    OC点语法介绍和使用以及@property关键字
    查看>>
    oc知道经纬度求位置
    查看>>
    OC高效率52之提供“全能初始化”方法
    查看>>
    oc--习题
    查看>>
    oday!POC管理和漏洞扫描小工具
    查看>>
    ODBC的JAR包和PLSQL
    查看>>
    ODE网络:一场颠覆RNN的革命即将到来
    查看>>
    Odin 开源项目教程
    查看>>
    odoo14配置阿里云免费SSL证书
    查看>>
    odoo系统局域网及外网访问?快解析内网穿透方案教程
    查看>>
    Odoo:在选项卡中重用来自另一个模型的TreeView
    查看>>
    Odoo:如何将SQL语句转换为域
    查看>>
    ODP.Net Tips
    查看>>
    OD字符串条件断点 [STRING[ESP+8]] == "123456"
    查看>>
    OD调试的程序无法处理例外
    查看>>
    OEA ORM中的分页支持
    查看>>
    ofbiz 定义
    查看>>