第三章 OpenCv基本入门使用

第三章 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库函数。

猜你喜欢

转载自blog.csdn.net/a369189453/article/details/85229840