在(1),(2)中都有看到cv::imread,cv::namewindows,cv::imshow这三个函数,这里就来说一下这三个函数,最后再说一下cv::imwrit这个函数。
由于opencv中的C++类和函数都是定义在命名空间cv中,所以上面每个函数前面都有cv::,这样才可以访问。我们知道在C++中还有另一种访问的方式就是在代码的适当的开始处添加using namespace cv;这样在访问的时候就不需要再添加cv::了。
下面进入今天的正题了,
1. 加载一幅图像 cv::imread
函数原型:
Mat imread(const string& filename, int flags=1 )
参数:
filename ---- 要加载的文件和名字
Flags ---- 指定图像加载的类型
>0 返回一个三通道颜色的图像
=0 返回一个灰色图像
<0 返回一个包含Alpha通道的图像。(if (flags > 0) 一个四通道RGBA的图像被加载,返回RGB图像,)
imread加载一个指定的图像文件并返回它。如果图像因为路径不对,权限问题,非法格式等问题出现加载失败,imread返回一个空的矩阵(Mat::data ==NULL),当前可以支持的读取的图像文件格式有:
Windows 位图 - *.bmp, *.dib (always supported)
JPEG 文件 - *.jpeg, *.jpg, *.jpe (see the Notes section)
JPEG 2000 f文件 - *.jp2 (see the Notes section)
PNG图像 - *.png (see the Notes section)
便携文件格式 - *.pbm, *.pgm, *.ppm (always supported)
Sun rasters 光栏文件 - *.sr, *.ras (always supported)
TIFF 文件 - *.tiff, *.tif (see the Notes section)
2. 在窗口中显示指定的图像 imshow
函数原型: void imshow(const string& winname, InputArray image)
参数:
winname – 窗口的名字
Image ----- 要显示的图像
功能:
在指定的窗口上显示一幅图像。如查这个窗口的创建是使用参数
CV_WINDOW_AUTOSIZE ,则图像将按照源尺寸显示。否则图像将被缩放到合适的窗口大小显示。图像的缩放功能依赖于图像的深度:
If the image is 8-bit unsigned, it is displayed as is.
If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256. That is, the value range [0,255*256] is mapped to [0,255].
If the image is 32-bit floating-point, the pixel values are multiplied by 255. That is, the value range [0,1] is mapped to [0,255].
3. 创建一个窗口 namewindow
函数原型:
void namedWindow(const string &winname,int flags)
参数:
winame ---- 窗口的名字,也用于一个窗口的标识
Flags ---- 窗口的一个标志.如果设置为CV_WINDOW_AUTOSIZE,这个窗口将自动的使用图像的大小,且不可以改变窗口的大小。默认参数为CV_WINDOW_AUTOSIZE.
其他的标识:
CV_WINDOW_NORMAL设置这个值用户可以设置窗口大小
CV_WINDOW_OPENGL 创建的窗口支持opengl
功能:
创建一个窗口用于显示图像和进度条。
在使用完创建的窗口后可以使用destroyWindow或是estroyAllWindow来关闭窗口。在前面的文章里用到函数都了解完了,现在再来看一下imwrite
4. 写图像文件 imwrite
函数原型:
bool imwrite(const string& filename, InputArray image, const vector<int>& params=vector<int>())
参数:
filename 文件的名字(注:需要加上文件的格式)
Image 要被保存的图像
Params 特定格式保存的参数编码
功能:
imwrit 函数用于将图像保存到指定的文件。图像的格式是基于文件的扩展名的,可以保存的扩展名和imread中要以读取的扩展名一样。
对于其他的三个在前面的程序中都有出现过,就不再写例子了,imwrite这个还没有使用过
在这里写一个简单的例子。看下面的代码:
#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
void imwrite_test()
{
bool sign = true;
Mat image = imread("F:/images/group.jpg");
Mat result;
cv::cvtColor(image,result,CV_BGR2GRAY);//把彩色转换为灰度图
sign = imwrite("F:/images/grount_gray.jpg",result); //保存图像
if(sign != true)
{
return;
}
cv::namedWindow("image");
cv::imshow("image",image);
cv::namedWindow("result");
cv::imshow("result",result);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
imwrite_test();
return a.exec();
}
在写入的目录下可以看到