1. 程式人生 > >第三章 OpenCv基本入門使用

第三章 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庫函式。