加载、修改、保存图像
加载图像(用cv::imread)
imread 在不填参数时,默认为RGB图。
放回为一个Mat类型的值
判断图像是否加载成功
Mat src = imread("图片");
if(src.empty())
{
printf("error read\n");
}
或者
if(!src.data)
{
printf("error read\n");
}
显示图像(cv::namedwindow 与 cv:: imshow)
有imshow一定要有namedwindow!namedwindow不是多余的!
namedWindow函数的作用是,通过指定的名字,创建一个可以作为图像和进度条的容器。它是由opencv自动 创建与释放,你无需去销毁它。
imshow 函数详解:imshow 函数用于在指定的窗口中显示图像。
通俗地讲,namedWindow是一容器,放imshow的图片,如果没有容器,相关控件可能出不来。
Mat src = imread("picture.bmp");
namedwindow("窗口名称",WINDOW_AUTOSIZE);
imshow("窗口名称",src);
窗口名称必须保持一致才能将imshow的图片放到namedwindow创建的窗口里。
修改图像的通道(cv::cvtColor)
convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。
而cvtColor()函数是负责转换不同通道的Mat,因为该函数的第4个参数就可以设置目的Mat数据的通道数
void cvCvtColor( const CvArr* src, CvArr* dst, int code );
src
输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像。表示源图像。
dst
输出的8-bit, 16-bit或 32-bit单倍精度浮点数影像。表示色彩空间转换之后的图像。
code
色彩空间转换的模式,该code来实现不同类型的颜色空间转换。
比如CV_BGR2GRAY表示转换为灰度图.其中当code选用CV_BGR2GRAY时,dst需要是单通道图片
CV_BGR2HSV将图片从RGB空间转换为HSV空间。当code选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。
修改图像的数据类型(cv::convertTo)
格式:CV_ [每一项的位数] [有符号或无符号] [类型前缀] C [通道数]
保存图像(cv::imwrite)
另外也可以不用imwrite()函数来存图片数据,可以直接用通用的XML IO接口函数将数据存在XML或者YXML中。
注意也不是所有格式的Mat型数据都能被使用保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。
如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor()函数来进行转换
第一个参数可以决定输出的格式以及保存的路径,如果只是填图片名及其格式,将保存在工程目录下。
第二个参数为要保存的Mat类图片。
代码示例如下
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat src = imread("liaowenbin.bmp");
if (src.empty())
{
printf("could not load image...\n");
return - 1;
}
//namedWindow和imshow相随相伴,永不分离
namedWindow("test opencv setup",CV_WINDOW_AUTOSIZE);
imshow("test opencv setup",src);
namedWindow("output window",CV_WINDOW_AUTOSIZE);
Mat output_image;
//颜色空间转换
cvtColor(src,output_image,COLOR_BGR2HLS);
imshow("output window",output_image);
imwrite("output_image.bmp",output_image);
waitKey(0);
return 0;
}