OpenCV 基于C++图像读取及存储API函数

       OpenCV可以从存储介质中读入图像,也可以将摄像头(Camera)抓取的图像载入内存,然后进行处理。而存储图像就是将内存中的图像数据写入存储介质中,如写入硬盘、优盘等。

       OpenCV要读入图像、操作图像。首先要用到Mat类,并且需创建Mat对象。要用Camera抓取图像需用到VideoCapture 类,并构建VideoCapture对象。

       从档案读入图像 

       读入图像 需用到imread()函数,其基于的原型如下:

       Mat cv::imread(const String& filename, int flags =  IMREAD_COLOR)  

        参数filename为需读入图像的完整名称,包含文件路径、文件名、及扩展名。扩展名必须是OpenCV支持的图像类型。OpenCV支持的图像类型如下:

       参数 flags包含以下几种:

        IMREAD_COLOR           为缺省值,读入图像时,将图像装换为3通道 BGR 色彩图像。

        IMREAD_UNCHANGED 读入图像时按原样返回加载的图像(如果原图存在alpha通道,否则会被裁                                              剪)。忽略 EXIF方向。

         IMREAD_GRAYSCALE 读入图像时,把图像转换为单通道的灰度图像。

         IMREAD_ANYDEPTH  如果原图为16bit/32bit,读入时保留原图像深度,其余的转换为8bit。 

        IMREAD_ANYCOLOR  以任何可能的颜色格式读取图像。也就是保留原图像格式。

        IMREAD_LOAD_GDAL 读入图像时, 使用gdal驱动程序加载图像。

        IMREAD_REDUCED_GRAYSCALE_2  读入图像时,将图像转换为单通道灰度图像,图像大小减小1/2。

        IMREAD_REDUCED_COLOR_2  读入图像时,将图像转换为3通道BGR色彩图像,并且图像大小减1/2。

        IMREAD_REDUCED_GRAYSCALE_4  读入图像时,将图像转换为单通道灰度图像,图像大小减小1/4。

        IMREAD_REDUCED_COLOR_4  读入图像时,将图像转换为3通道BGR色彩图像,并且图像大小减1/4。

        IMREAD_REDUCED_GRAYSCALE_8  读入图像时,将图像转换为单通道灰度图像,图像大小减小1/8。

        IMREAD_REDUCED_COLOR_8   读入图像时将图像转换为3通道BGR色彩图像,并且图像大小减1/8。

        IMREAD_IGNORE_ORIENTATION 读入图像时,不会根据EXIF的方向标志旋转图像。

       显示图像  

      要显示读入图像则需用到imshow()函数,imshow()函数的原型如下:

      void cv::imshow(const String & winname, InputArray mat)

      winname 为显示图像窗口的名称,如果输入的名称为一个建好的窗口,图像将显示在该窗口上,如果不存在输入名的窗口,则以输入名新建一个窗口,并将图像显示在该窗口上。

       mat 为装载有欲显示图片的Mat对象。

       存储图像

       要存储图像需用到 imwrite()函数,imwrite()函数的原型如下:

       bool cv::imwrite(const String & filename, InputArry img, const std::vector<int>& params = std::vector<int>())

      参数filename 为存储到介质中的完整文件名,需包含存储路径、文件名、扩展名。扩展名必须是OpenCV支持的图像类型。

      参数img为载有需存储图像的Mat对象。最后一个参数,通常保持缺省状态不予理会。

      图像读入、显示、存储示例

      下面以一个实例来演示OpenCV图像读入、显示、存储操作。

      1. 新建一个VC2022控制台空项目,将需操作的图片Copy到该项目文件夹下(这里略去OpenCV4.8在VS2022中的配置操作介绍)。

      2. 在解决方案源文件夹中添加新建项main.cpp

       3. 在main.cpp中添加源代码,所加代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
	Mat src1 = imread("1.jpg", IMREAD_UNCHANGED);
	namedWindow("src1", WINDOW_AUTOSIZE);
	imshow("src1", src1);
	Mat src2 = imread("1.jpg", IMREAD_GRAYSCALE);
	namedWindow("src2", WINDOW_AUTOSIZE);
	imshow("src2", src2);
	Mat src3 = imread("1.jpg", IMREAD_COLOR);
	namedWindow("src3", WINDOW_AUTOSIZE);
	imshow("src3", src3);
	Mat src4 = imread("1.jpg", IMREAD_ANYDEPTH);
	namedWindow("src4", WINDOW_AUTOSIZE);
	imshow("src4 ", src4);
	Mat src5 = imread("1.jpg", IMREAD_ANYCOLOR);
	namedWindow("src5", WINDOW_AUTOSIZE);
	imshow("src5", src5);
	Mat src6 = imread("1.jpg", IMREAD_LOAD_GDAL);
	namedWindow("src6", WINDOW_AUTOSIZE);
	imshow("src6 ", src6);
	Mat src7 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_2);
	namedWindow("src7", WINDOW_AUTOSIZE);
	imshow("src7", src7);
	Mat src8 = imread("1.jpg", IMREAD_REDUCED_COLOR_2);
	namedWindow("src8", WINDOW_AUTOSIZE);
	imshow("src8", src8);
	Mat src9 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_4);
	namedWindow("src9", WINDOW_AUTOSIZE);
	imshow("src9", src9);
	Mat src10 = imread("1.jpg", IMREAD_REDUCED_COLOR_4);
	namedWindow("src10", WINDOW_AUTOSIZE);
	imshow("src10", src10);
	Mat src11 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_8);
	namedWindow("src11", WINDOW_AUTOSIZE);
	imshow("src11", src11);
	Mat src12 = imread("1.jpg", IMREAD_REDUCED_COLOR_8);
	namedWindow("src12", WINDOW_AUTOSIZE);
	imshow("src12", src12);
	Mat src13 = imread("1.jpg", IMREAD_IGNORE_ORIENTATION);
	namedWindow("src13", WINDOW_AUTOSIZE);
	imshow("src13", src13);

	moveWindow("src1", 10, 50);
	moveWindow("src2", 10, src1.rows + 100);
	moveWindow("src3", src1.cols  + 10, 50);
	moveWindow("src4", src1.cols  + 10, src1.rows + 100);
	moveWindow("src5", src1.cols * 2 + 10, 50);
	moveWindow("src6", src1.cols * 2 + 10, src1.rows + 100);

	moveWindow("src7", src1.cols * 3 + 10, 50);
	moveWindow("src8", src1.cols * 3+ 10, src1.rows + 100);
	moveWindow("src9", src1.cols * 4 + 10, 50);
	moveWindow("src10", src1.cols * 4 + 10, src1.rows + 100);
	moveWindow("src11", src1.cols * 5 + 10, 50);
	moveWindow("src12", src1.cols * 5 + 10, src1.rows + 100);
	moveWindow("src13", src1.cols * 6 + 10, 50);
	imwrite("1.bmp", src2);
	waitKey(0); // wait till any key is pressed
	return 0;
}

    4. 试运行 按ctrl+F5,结果如下:

打开项目文件夹,可以看到多出了一个1.bmp文件。

双击这个文件,用Win10照片打开。

结果如下:

是一张灰度图片说明存储正确。 

从摄像头获取图像

将前面的部分代码注释掉,加入如下代码:


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
	/*
	Mat src1 = imread("1.jpg", IMREAD_UNCHANGED);
	namedWindow("src1", WINDOW_AUTOSIZE);
	imshow("src1", src1);
	Mat src2 = imread("1.jpg", IMREAD_GRAYSCALE);
	namedWindow("src2", WINDOW_AUTOSIZE);
	imshow("src2", src2);
	Mat src3 = imread("1.jpg", IMREAD_COLOR);
	namedWindow("src3", WINDOW_AUTOSIZE);
	imshow("src3", src3);
	Mat src4 = imread("1.jpg", IMREAD_ANYDEPTH);
	namedWindow("src4", WINDOW_AUTOSIZE);
	imshow("src4 ", src4);
	Mat src5 = imread("1.jpg", IMREAD_ANYCOLOR);
	namedWindow("src5", WINDOW_AUTOSIZE);
	imshow("src5", src5);
	Mat src6 = imread("1.jpg", IMREAD_LOAD_GDAL);
	namedWindow("src6", WINDOW_AUTOSIZE);
	imshow("src6 ", src6);
	Mat src7 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_2);
	namedWindow("src7", WINDOW_AUTOSIZE);
	imshow("src7", src7);
	Mat src8 = imread("1.jpg", IMREAD_REDUCED_COLOR_2);
	namedWindow("src8", WINDOW_AUTOSIZE);
	imshow("src8", src8);
	Mat src9 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_4);
	namedWindow("src9", WINDOW_AUTOSIZE);
	imshow("src9", src9);
	Mat src10 = imread("1.jpg", IMREAD_REDUCED_COLOR_4);
	namedWindow("src10", WINDOW_AUTOSIZE);
	imshow("src10", src10);
	Mat src11 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_8);
	namedWindow("src11", WINDOW_AUTOSIZE);
	imshow("src11", src11);
	Mat src12 = imread("1.jpg", IMREAD_REDUCED_COLOR_8);
	namedWindow("src12", WINDOW_AUTOSIZE);
	imshow("src12", src12);
	Mat src13 = imread("1.jpg", IMREAD_IGNORE_ORIENTATION);
	namedWindow("src13", WINDOW_AUTOSIZE);
	imshow("src13", src13);

	moveWindow("src1", 10, 50);
	moveWindow("src2", 10, src1.rows + 100);
	moveWindow("src3", src1.cols  + 10, 50);
	moveWindow("src4", src1.cols  + 10, src1.rows + 100);
	moveWindow("src5", src1.cols * 2 + 10, 50);
	moveWindow("src6", src1.cols * 2 + 10, src1.rows + 100);

	moveWindow("src7", src1.cols * 3 + 10, 50);
	moveWindow("src8", src1.cols * 3+ 10, src1.rows + 100);
	moveWindow("src9", src1.cols * 4 + 10, 50);
	moveWindow("src10", src1.cols * 4 + 10, src1.rows + 100);
	moveWindow("src11", src1.cols * 5 + 10, 50);
	moveWindow("src12", src1.cols * 5 + 10, src1.rows + 100);
	moveWindow("src13", src1.cols * 6 + 10, 50);
	imwrite("1.bmp", src2);
	*/
	VideoCapture cp;
	Mat frCamera;
	cp.open(0);
	if (!cp.isOpened())
		cout << "Camera Cann't be opened!" << endl;
	else
	{
		  cp >> frCamera;
		  imshow("Camera Image", frCamera);
	}
	waitKey(0); // wait till any key is pressed
	return 0;
}

 试运行  按Ctrl+F5结果如下:

  

可以看出,摄像头抓取的图片已传入Mat对象,并显示在窗口中。

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值