OpenCV简单实例

 Max.C     2020-04-17   4360 words    & views

一、图像读写

1、读取

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

返回读取得到的一个Mat矩阵,读取图像失败时返回一个空的矩阵对象(Mat::data == NULL);

第一个参数为文件路径,第二个参数flags为读取标记,用于选择读取图片的方式,默认值为IMREAD_COLOR,flag值的设定与用什么颜色格式读取图片有关。

//函数调用
Mat image = imread(path_name);

2、写入

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

第一个参数为文件路径;第二个参数表示Mat类型的图像数据;第三个参数表示为特定格式保存的参数编码,一般情况下不用写。

//函数调用
imwrite(store_path, image);

二、图像显示

读取一张图片并显示出来,读取得到的数据类型为IplImage

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

using namespace std;
using namespace cv;

int main(){
    IplImage *img = cvLoadImage("pic/pro30.jpg"); //读取图片
    cvNamedWindow("window1", CV_WINDOW_AUTOSIZE); //创建窗口
    cvShowImage("window1",img); //窗口显示图片
    cvWaitKey(0); //等待时间,正数时以毫秒为单位,0时等待按键操作
    cvReleaseImage(&img); //释放图像文件
    cvDestroyWindow("window1"); //销毁窗口
}

三、高斯模糊

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

using namespace std;
using namespace cv;

int main(){
    IplImage *img = cvLoadImage("pic/test1.jpg");
    cvNamedWindow("emp_in");
    cvShowImage("emp_in",img);

    IplImage *imgout = cvCreateImage(
        cvGetSize(img),  //Size
        IPL_DEPTH_8U,  //像素点数据类型
        3  //通道数
    );
    cvSmooth(img, imgout, CV_GAUSSIAN, 15, 15); //高斯模糊处理
    cvNamedWindow("emp_out");
    cvShowImage("emp_out",imgout);

    cvWaitKey(0);
    cvReleaseImage(&img);
    cvReleaseImage(&imgout);
    cvDestroyWindow("emp_in");
    cvDestroyWindow("emp_out");
}

函数原型:

void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,
        int param1, int param2, double param3, double param4 );
  • src:输入图像

  • dst:输出图像.

  • smoothtype:平滑方法

  • param1:平滑操作的第一个参数.

  • param2:平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值为零,则表示其被设定为param1。

  • param3:对应高斯参数的 Gaussian sigma (标准差).

平滑方法有以下几种:

CV_BLUR_NO_SCALE(简单不带尺度变换的模糊) - -对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。

CV_BLUR (simple blur)- -对每个象素param1×param2邻域求和并做尺度变换 1/(param1×param2)。

CV_GAUSSIAN(gaussian blur) - -对图像进行核大小为 param1×param2 的高斯卷积。

CV_MEDIAN(median blur) - -对图像进行核大小为param1×param1 的中值滤波 (邻域是方的)。

CV_BILATERAL(双向滤波) - -应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2。

四、视频生成

下面是一个简单的生成视频实例,当前目录已有N张图片并且按照顺序命名,下面将其合成一个视频:

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

cv::VideoWriter writer;
using namespace std;
using namespace cv;

int main()
{
    //初始化
  	int N = 3000,dataNum = 0;
    string data_path = "./";
    string data_name = to_string(dataNum);
    string left_path = "./pic_";
  
  	//读取第一张图片,得到视频的长宽
    Mat src=imread(left_path+ data_name+".jpg",1);
    int isColor = 1; //颜色设定
    int fps = 10; //帧数
    int frameWidth = src.cols;
    int frameHeight = src.rows;

    //视频文件初始化
  	writer = VideoWriter("./Aplay.avi",CV_FOURCC('M','J','P','G'), fps,
                       Size(frameWidth, frameHeight), isColor);

    for (int i = 0; i < dataNum+N; i++)
    {
        data_name = to_string(i);
        src=imread(left_path+ data_name+".jpg",1);
        if (src.empty())
        {
           cout<<" 全部图像加载完成!";
            break;
        }
        imshow("【src】", src); //显示
        waitKey(5);
        writer.write(src);  //写入视频文件
    }
}

核心部分是cv::videowriter类, 这是在opencv中提供的录制视频的句柄,基本操作有如下几种(与上述代码不怎么相同):

//声明
VideoWriter writer;
//打开
writer.open("path/04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
        rate, //不进行跟踪,定位,只显示、录制时的帧率
        Size(inFrame.cols,inFrame.rows),
        true);
    if (!writer.isOpened())
    {
        return;
    }
//输入
writer<<inFrame;
//释放
writer.release();

其中打开操作与构造函数相同,其参数如下:

(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
  • filename:输出视频文件名。

  • fourcc:四个字符用来表示压缩帧的codec例如:

    • CV_FOURCC(‘P’,’I’,’M’,’1’) = MPEG-1 codec
    • CV_FOURCC(‘M’,’J’,’P’,’G’) = motion-jpeg codec
    • CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
    • CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
    • CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
    • CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
    • CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
    • CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec
    • 若编码器代号为 -1,则运行时会弹出一个编码器选择框.
  • fps:被创建视频流的帧率。

  • frame_size:视频流的大小。

  • is_color 如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。

参考资料

opencv基础知识-videowriter