第三章 OpenCv基本入门使用
1 头文件说明
头文件集中地:opencv2/opencv.hpp
该头文件包含了opencv各个模块的头文件,如果是仅仅刚开始学习OpenCv而不是正式开发实际项目,那么为了简单,可以直接引用opencv2/opencv.hpp头文件,一股脑的将所有模块的头文件包含进来。
2 显示一张图片
示例代码:
/// <summary>
/// 描述:利用OpenCv函数库显示一张图片
/// </summary>
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
// 1、 读取图片到Mat中
Mat img = imread("../../../../imgs/sor2.jpg");
if (img.empty())
return -1;
// 2、 创建一个显示窗口
namedWindow("DisplayWindow");
//3、在窗口上显示Mat中的图片
imshow("DisplayWindow", img);
//4、等待按键
waitKey(0);
return 0;
}
3 OpenCv播放视频
本质:视频播放的本质就是显示图像,即视频中的一帧一帧的显示图像。
示例代码:
#include "QtGuiApplication1.h"
//#define Ui
#ifndef Ui
#include <QFileInfo>
#include <QDir>
#include <opencv2\opencv.hpp>
using namespace cv;
#else
#include <QtWidgets/QApplication>
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef Ui
QtGuiApplication1 w;
w.show();
return a.exec();
#else
QString path = QFileInfo(QCoreApplication::applicationDirPath(), "../../../../../").absoluteDir().absolutePath() + "/imgs/";
VideoCapture cap(path.toStdString() + "time.mp4", IMREAD_GRAYSCALE);
if (!cap.isOpened())
return -1;
Mat frame;
while (1)
{
cap >> frame;
if (frame.empty())
break;
imshow("VideoWindow", frame);
if (waitKey(33) >= 0)
break;
}
return 0;
#endif
}
4 简单的平滑变换
本质:利用OpenCv中现有的高斯变换对图像进行平滑处理。
示例代码:
#include "QtGuiApplication1.h"
//#define Ui
#ifndef Ui
#include <QFileInfo>
#include <QDir>
#include <opencv2\opencv.hpp>
using namespace cv;
#else
#include <QtWidgets/QApplication>
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef Ui
QtGuiApplication1 w;
w.show();
return a.exec();
#else
QString path = QFileInfo(QCoreApplication::applicationDirPath(), "../../../../../").absoluteDir().absolutePath() + "/imgs/";
Mat sor = imread(path.toStdString() + "sor2.jpg", IMREAD_UNCHANGED);
imshow("原图", sor);
Mat dst;
GaussianBlur(sor, dst, Size(5, 5), 3, 3);
GaussianBlur(dst, dst, Size(5, 5), 3, 3);
imshow("效果图", dst);
waitKey();
return 0;
#endif
}
效果图:
5 不那么简单的变换
本质:利用OpenCv中的pyrDown()函数对图像进行高斯模糊及降采样,利用Canny()函数对图像进行边缘检测。
示例代码:
#include "QtGuiApplication1.h"
//#define Ui
#ifndef Ui
#include <QFileInfo>
#include <QDir>
#include <opencv2\opencv.hpp>
using namespace cv;
#else
#include <QtWidgets/QApplication>
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef Ui
QtGuiApplication1 w;
w.show();
return a.exec();
#else
QString path = QFileInfo(QCoreApplication::applicationDirPath(), "../../../../../").absoluteDir().absolutePath() + "/imgs/";
Mat sor = imread(path.toStdString() + "sor6.jpg", IMREAD_UNCHANGED);
Mat dst;
// 图像转换为单通道
cvtColor(sor, dst, COLOR_BGR2GRAY);
// 降采样:长宽减半
pyrDown(dst, dst);
//边缘检测
Canny(dst, dst, 10, 100, 3, true);
// 对比显示
imshow("Sor", sor);
imshow("Dst", dst);
waitKey();
return 0;
#endif
}
效果图:
6 写入AVI文件
本质:利用VideoCapture获取视频,对视频中的帧图像进行对数变换,显示变换结果,并另存为新视频。
示例代码:
#include "QtGuiApplication1.h"
//#define Ui
#ifndef Ui
#include <QFileInfo>
#include <QDir>
#include <opencv2\opencv.hpp>
using namespace cv;
#else
#include <QtWidgets/QApplication>
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef Ui
QtGuiApplication1 w;
w.show();
return a.exec();
#else
QString path = QFileInfo(QCoreApplication::applicationDirPath(), "../../../../../").absoluteDir().absolutePath() + "/imgs/";
VideoCapture cap(path.toStdString() + "time.mp4");
if (!cap.isOpened())
return -1;
// 获取每秒帧数
double fps = cap.get(CAP_PROP_FPS);
// 视频图像的尺寸大小
Size size((int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT));
VideoWriter writer;
writer.open(path.toStdString() + "Newtime.mp4", CAP_PROP_FOURCC, fps, size);
Mat sor, dst;
while (1)
{
cap >> sor;
if (sor.empty())
break;
imshow("Sor", sor);
logPolar(sor, dst, Point2f(sor.cols / 2, sor.rows / 2), 40, WARP_FILL_OUTLIERS);
imshow("Dst", dst);
writer << dst;
if (waitKey(35) >= 0)
break;
}
cap.release();
return 0;
#endif
}
7 总结
这一张章主要介绍了openCv的一些简单用法,旨在引导如何使用opnecv库函数。