OpenCV之图像的载入、显示与输出

先上代码

int main(int argc, char** argv)
{	
    Mat image0 = imread("1.png", 2 | 4); //载入无损原图像
	Mat image1 = imread("1.png", 0);//载入灰度图
	Mat image2 = imread("1.png", 200);//载入3通道的彩色图像

	imshow("载入无损原图像", image0);
	imshow("载入灰度图", image1);
	imshow("载入3通道的彩色图像", image2);
	waitKey();
}

imread()

imread函数:加载或读取一张图片

第一个参数: 填我们需要载入的图片的路径,默认路径在src目录下

支持的图片格式有

第二个参数:int类型的flags,为载入标识符,自带默认值为1

在imgcodecs.hpp文件中我们可以看到枚举是这样定义的

enum ImreadModes {
       IMREAD_UNCHANGED            = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.
       IMREAD_GRAYSCALE            = 0,  //!< If set, always convert image to the single channel grayscale image (codec internal conversion).
       IMREAD_COLOR                = 1,  //!< If set, always convert image to the 3 channel BGR color image.
       IMREAD_ANYDEPTH             = 2,  //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
       IMREAD_ANYCOLOR             = 4,  //!< If set, the image is read in any possible color format.
       IMREAD_LOAD_GDAL            = 8,  //!< If set, use the gdal driver for loading the image.
       IMREAD_REDUCED_GRAYSCALE_2  = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
       IMREAD_REDUCED_COLOR_2      = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
       IMREAD_REDUCED_GRAYSCALE_4  = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
       IMREAD_REDUCED_COLOR_4      = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
       IMREAD_REDUCED_GRAYSCALE_8  = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
       IMREAD_REDUCED_COLOR_8      = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
       IMREAD_IGNORE_ORIENTATION   = 128 //!< If set, do not rotate the image according to EXIF's orientation flag.
     };

需要注意: flags可以使用 | 来附加多个标志,但是如果标志冲突的话,就会自动取最小的一个

imshow()

 imshow函数:显示一张图片

第一个参数:填需要显示的窗口的标识名称

第二个参数:InputArray类型的mat,填需要显示的图像

namedWindow()

namedWindow()函数:用于创建一个窗口。 若是简单地进行图片显示,可以略去namedWindow函数的调用,即先调用imread读入图片,然后用imshow直接指定出窗口名进行显示即可。但需要在显示窗口之前就用到窗口名时,比如滑动条的使用,要指定滑动条依附到某个窗口上,就需要namedWindow函数先创建出窗口,显式地规定窗口名称了。

第一个参数:填写被用作窗口的标识符的窗口名称。

第二个参数:int类型的flags,窗口的标识,可以填如下几种值。

 首先需要注意的是,namedWindow函数有默认值WINDOW_ AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。namedWindow函数的作用是通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口已经存在,则函数不做任何事情。我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。

imwrite()

 imwrite()函数:输出图像到文件

第一个参数:const string&类型的filename, 填需要写入的文件名。注意要带上后缀,如“123.jpg”。

第二个参数:InputArray 类型的img,-般填个Mat类型的图像数据。

第三个参数:const vector<int> &类型的params,表示为特定格式保存的参数编码。它有默认值vector<int>(),所以一般情况下不需要填写。而如果要填写的话,有下面这些需要了解的地方:

●对于JPEG格式的图片,这个参数表示从0到100的图片质量(CV_ IMWRITE_ JPEG_ QUALITY), 默认值是95。

●对于PNG格式的图片,这个参数表示压缩级别(CV_ IMWRITE PNG_COMPRESSION)从0到9。较高的值意味着更小的尺寸和更长的压缩时间,默认值是3。

●对于PPM,PGM,或PBM格式的图片,这个参数表示一个二进制格式标志(CV_ IMWRITE_ PXM_ BINARY),取值为0或1,默认值是1。

imwrite函数用于将图像保存到指定的文件。图像格式是基于文件扩展名的,可保存的扩展名和imread中可以读取的图像扩展名一-致。

	//1.图像的载入和显示
	Mat toy = imread("3.jpg");
	namedWindow("toyPic", WINDOW_NORMAL);
	imshow("toyPic", toy);
	waitKey(0);

//2.初级图像混合
	//载入背景图 和 logo图
	Mat logo = imread("4.jpg");
	Mat image = imread("3.jpg");
	namedWindow("picOne", WINDOW_NORMAL);
	imshow("picOne", logo);
	namedWindow("picTwo", WINDOW_NORMAL);
	imshow("picTwo", image);

	cout << "logo.cols = " << logo.cols <<"    logo.rows = " <<logo.rows << endl;
	cout << "image.cols = " << image.cols << "    image.rows = " << image.rows << endl;

	//定义一个Mat类型,用于存放图像的ROI
	Mat imageRoi;
	//方式一
	rectangle(image, Rect(0, 0, 600, 200), Scalar(0, 255, 0), 2); //将感兴趣区域框出来

	imageRoi = image(Rect(0, 0, logo.cols, logo.rows));
	//方式二
	//imageRoi = image(Range(350, 350 + logo.rows), Range(800, 800 + logo.cols));
	//把logo加到原图上
	addWeighted(imageRoi, 0.5, logo, 0.5, 0.0, imageRoi);
	namedWindow("allImage", WINDOW_NORMAL);
	//显示结果
	imshow("allImage", imageRoi);

	waitKey(0);

上面这个程序我进行了不少调试,因为不清楚这些参数的作用。用到了imageRoi这个变量,当时我在想为什么是这个变量名呢,然后简单搜了一下,果然是有原因。

在图像处理领域,有一个非常重要的名词ROI。

什么是ROI?

它的英文全称是Region Of Interest,对应的中文解释就是感兴趣区域。

感兴趣区域,就是我们从图像中选择一个图像区域,这个区域就是图像分析所关注的焦点。我们圈定这个区域,那么我们要处理的图像就从大图像变为一个小图像区域了,这样以便进行进一步处理,可以大大减小处理时间。

定义ROI区域有两种方法:

第一种,指定矩形的坐标,并且规定好他的长宽。

Mat img = imread("1.jpg");
Mat roi = img(Rect(500, 200, 100, 300));//Rect四个形参分别是:x坐标,y坐标,长,高;注意(x,y)指的是矩形的左上角点

第二种,指定感兴趣的行或列的范围。

Mat img = imread("1.jpg");
Mat roi = img(Range(250, 250 + 100), Range(200, 200 + 100));//Range两个形参分别是:起始行或列,起始行或列+偏移量

绿色框的部分只是我做出的一个示例,并不是这个程序真正设置的区域,这个程序中设置的区域应该是

	rectangle(image, Rect(0, 0, logo.cols, logo.rows), Scalar(0, 255, 0), 2); //将感兴趣区域框出来

我想尝试下把在飞机上拍的那张照片缩放然后放到积木人那张图片里面

	//2.初级图像混合
	//载入背景图 和 logo图
	Mat logo = imread("4.jpg", 100);
	Mat image = imread("3.jpg");
	namedWindow("picOne", WINDOW_NORMAL);
	imshow("picOne", logo);
	namedWindow("picTwo", WINDOW_NORMAL);
	imshow("picTwo", image);

	cout << "logo.cols = " << logo.cols <<"    logo.rows = " <<logo.rows << endl;
	cout << "image.cols = " << image.cols << "    image.rows = " << image.rows << endl;

	//定义一个Mat类型,用于存放图像的ROI
	Mat imageRoi;
	//方式一
	rectangle(image, Rect(0, 0, 400, 400), Scalar(0, 255, 0), 6); //将感兴趣区域框出来

	imageRoi = image(Rect(0, 0, logo.cols, logo.rows));
	//方式二
	//imageRoi = image(Range(350, 350 + logo.rows), Range(800, 800 + logo.cols));
	//把logo加到原图上
	addWeighted(imageRoi, 0.5, logo, 0.5, 0.0, imageRoi);
	namedWindow("allImage", WINDOW_NORMAL);
	//显示结果
	imshow("allImage", image);

	waitKey(0);

我发现imread的第二个参数如果没有填入枚举里面的数字也是有用的,这并不奇怪,奇怪的是为什么填入数字范围不同,图片的分辨率似乎也会不同。 这个留着明天请教大佬吧。

	addWeighted(imageRoi, 0.5, logo, 0.5, 0.0, imageRoi);

剩下最后一个这个比较陌生,只是设置下图片的权重,参数比较简单。

参数一:图一,可以理解为背景图片

参数二:图一的权重,即融合比例

参数三:图二,可以理解为要融合的图片

参数四:图二的权重

参数五:融合后的图片的偏移量,值取得很大时图片发白

参数六:融合后的图片

猜你喜欢

转载自blog.csdn.net/sono_io/article/details/124085862