OpenCV 3.1 imwrite()函数写入异常问题解决方法
2017-04-15 20:37
387 查看
最近配置了OpenCV3.1版本,按照2.x的习惯写了一个保存图片的代码(测试证明该代码在2.4.11下运行正常),但是在使用imwrite()函数的时候出现了异常。
代码如下:
只是很简单的读入一个图片然后再保存它。运行后异常如下:
修改办法:
1.是将debug模式修改为Release,代码不用修改的情况下即可正常运行。
2.将imwrite()函数写入第三个参数,我们查看imwrite()的定义可以看到一个官方给出的例子:
IMWRITE_PNG_COMPRESSION 为对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9。较高的值意味着更小的尺寸和更长的压缩时间,而默认值是3。
所以上述程序中选择了压缩级别为9。除此之外OpenCV还提供了很多种其他的保存格式,在转到定义后的imgcodecs.hpp文件中都有很详细的介绍。
所以 我们只需要简单改写代码,即可解决异常问题。
最后,用以上两种办法都解决了异常,但是异常产生的原因是什么,为什么这样做就没有异常了,尤其是params参数本身就带默认值。这个问题我也没有弄明白,弄懂后在更新出来。
代码如下:
#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参数本身就带默认值。这个问题我也没有弄明白,弄懂后在更新出来。
相关文章推荐
- 关于opengl中颜色表函数glcolortable出现异常的问题(opengl红宝书8-7程序)解决方法
- OpenCV中用findContours函数出现的问题和解决方法
- PHP文件写入函数file_put_contents并发追加写入丢失内容问题解决方法
- 程序中和有js函数的网页交互,线程中调用 get_Script 就会错误的解决方法,由于COM的线程安全问题
- 关于OpenCV_1.1pre1a 安装若干问题的解决方法:
- Oracle表空间文件损坏导致的数据库异常关闭并启动失败问题的解决方法
- 在android模拟器上面执行OpenCV函数一闪就退出的解决方法
- botp单据转换时出现空异常的问题解决方法。
- fedora 15 安装opencv2.2时出现undefined reference to `cvCreateCameraCapture_V4L(int)'问题及其解决方法
- OpenCV常遇问题解决方法汇总
- 开机的时候如果出现提示$home/.dmrc无法写入 问题解决方法
- oracle中字符串连接以及在函数中常见问题的解决方法
- “VS2003调试时无法跟踪函数”问题解决方法
- PHP5中Date()函数获取时间相差8小时问题的解决方法
- 对于WSS里权限异常问题的解决方法
- (word导出问题)解决:服务器出现意外情况。 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))的解决方法
- 用va_start() va_end()函数解决不定参数问题(即,fun(...)实现方法)
- OpenCV常遇问题解决方法汇总
- 添加/删除程序空白窗口及控制面板窗口显示异常问题的解决方法
- sscanf 函数遇到的一个小问题及其解决方法