用OpenCV建立一幅只有几个像素且值可以自定义的图像,并输出保存到硬盘的方法!

时间:2021-09-27 22:15:57

本文作者是OpenCV代码网,网址http://opencv66.net/

有时候,我们在看OpenCV源码的时候,需要一幅非常简单的图像来测试(图像简单咱们可以做人工推算,然后与机器运算的结果对照),这个时候就需要用OpenCV建立一幅只有几个像素且值可以自定义的图像,并保存到硬盘。为什么要保存到硬盘呢?因为咱们还要在MATLAB中做验证啊!为啥不用MATLAB生成呢?原因可见我写的博文:

http://blog.csdn.net/wenhao_ir/article/details/51218032

首先用WIN7的画图功能建立一幅指定像素点数的图像,保存为XXX.jpg,然后放入相关工程文件下,接下来在OpenCV中建立如下关键代码:

PS:下面的这个代码只是C代码,我于2016-6-17日在此博文中补充了C++版本的代码!

#include <opencv2/opencv.hpp> 
#include <opencv2/legacy/compat.hpp>
#include <fstream>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
int main()
{
// 从文件中加载原图
IplImage *pSrcImage = cvLoadImage("pout1.jpg", CV_LOAD_IMAGE_UNCHANGED);
//创建输出的图像
IplImage *pOutImage_8U_1 = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1);
IplImage *g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);
cvConvertScale(g_pGrayImage,pOutImage_8U_1);//相当于复制图像
CvScalar s2;
s2.val[0]=50;
cvSet2D(pOutImage_8U_1,0,0,s2);
s2.val[0]=200;
cvSet2D(pOutImage_8U_1,0,1,s2);
s2.val[0]=220;
cvSet2D(pOutImage_8U_1,0,2,s2);
s2.val[0]=100;
cvSet2D(pOutImage_8U_1,0,3,s2);
s2.val[0]=200;
cvSet2D(pOutImage_8U_1,0,4,s2);
cvSaveImage("1234.jpg",pOutImage_8U_1);
double watch_pOutImage_8U_1[100];
int i;
for(i=0;i< 5;i++)
{
watch_pOutImage_8U_1[i]=cvGet2D(pOutImage_8U_1,0,i).val[0];
}
cvSaveImage("pOutImage_8U_1.jpg",pOutImage_8U_1);
//这里记得释放相关资源,由于不是正规程序,这里就不写资源的释放了哈
return 0;
}

运行完成之后在工程文件夹下就生成了pOutImage_8U_1.jpg,用MATLAB读入这幅图像,其值也为[50 200 220 100 200]

2016-6-17日补充C++代码:

在C++中cvSaveImage换成了imwrite,原型如下:

C++: bool imwrite(const string& filename, InputArray image, const vector<int>& params=vector<int>())
C: int cvSaveImage(const char* filename, const CvArr* image)

可见,imwrite比cvSaveImage多了一个参数,下面说下这个参数:

参数params是用来设置对应图片格式的参数的,因为一般情况下这些图片格式都是经过了压缩的,这里就是设置这些压缩参数来控制图片的质量。该参数是一个vector<int>类型,里面分别存入paramId_1, paramValue_1, paramId_2, paramValue_2, ... 也就是说存入一对属性值。如果不设置该参数的话,则程序会自动根据所保存的图像格式采用一个默认的参数。

下面给出我实际使用中的代码:

cv::imwrite("flower3_pepper.jpg",resultImage);//其中resultImage是MAT类型!

PS:MATLAB中也是使用imwrite来保存图像哦!OpenCV是在向MATLAB靠拢?

本文作者是OpenCV代码网,网址http://opencv66.net/