第三章 OpenCv基本入門使用
阿新 • • 發佈:2018-12-27
第三章 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庫函式。