在上一節的OpenCV簡介和配置中,我們寫了第一個OpenCV程序,加載了一張圖片并進行顯示。下面先給出上一節的第一個OpenCV程序并進行說明。
// OpenCVTest.cpp : 定義控制臺應用程序的入口點。
#include "stdafx.h"
#include <opencv2/opencv.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
cv::Mat img = cv::imread("J:\\VS2010Projects\\OpenCVTest\\OpenCVTest\\smallpi.jpg");
cv::imshow("hello world",img);
cv::waitKey(0);
return 0;
}
cv::imread函數
命名空間cv下的函數imread的原型為
Mat imread(const string& filename, int flags)
- 函數返回一個Mat類型的對象。
- 第一個參數指定圖片的路徑。
- 第二個參數指定圖片加載格式。
第二個參數flags可以為下面三個中的一個。
CV_LOAD_IMAGE_UNCHANGED (以RGBA格式加載,一個像素占4byte內存)
CV_LOAD_IMAGE_GRAYSCALE (以灰度圖像的格式加載,一個像素占1byte內存)
CV_LOAD_IMAGE_COLOR (以RGB格式加載,一個像素占3byte內存)
CV_LOAD_IMAGE_COLOR 是默認的圖片加載格式。
Mat類
cv::imread函數讀取圖片后的就返回一個Mat類型的對象。Mat類對象保存著所加載圖片的信息。
- Mat類的data屬性為指向圖像數值數組的第一個元素的unsigned char類型的指針。每一個矩陣元素為1byte的0~255的整數。
- 當為RGB格式加載圖像時,圖像數值數組的格式為 B值-G值-R值-B值......, 即數值數組的第一個元素為第一個像素的藍色值, 數值數組的第二個元素為第一個像素的綠色值,數值數組的第三個元素為第一個像素的紅色值....
- Mat類的rows()方法獲得圖像像素的行數,cols()方法獲得圖像像素的列數。
Mat類還有許多有用的屬性和方法,以后用到時再作說明。
cm::imshow函數
cm::imshow函數的原型為
void imshow(const string &winname, cv::InputArray mat);
- 第一個參數指定應用程序的名稱。
- 第二個參數為一個Mat類型的對象。
cm:; waitKey函數
waitKey在這里的作用是等待用戶鍵盤或鼠標的輸入,使得應用程序不會閃一下就退出了。
頭文件引入
上面的OpenCV程序引入頭文件的形式如下
#include <opencv2/opencv.hpp>
實際上,opencv.hpp文件的作用就是幫我們把所有的OpenCV頭文件引入進來。opencv.hpp的源碼如下。
#ifndef __OPENCV_ALL_HPP__
#define __OPENCV_ALL_HPP__
#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#endif
這是一種頭文件引入時偷懶的作法。引入所有的文件可能會增加程序的大小。
小結
- 對第一個OpenCV程序中的imread、imshow、waitKey函數進行的小小的說明。
- 說明了OpenCV庫的引入方式。