1. 程式人生 > >Android OpenCV影象識別和影象追蹤

Android OpenCV影象識別和影象追蹤

首先介紹一下OpenCV中影象識別和跟蹤機制:        影象跟蹤機制是確定矩目標在3D環境中的姿態,並根據此類資訊環繞目標物件繪製輪廓線。在最終的2D影象中,考慮到目標可能相對於相機傾斜,因而輪廓線將呈現為四邊形(不一定是矩形)。        上述跟蹤機制主要包含以下四個步驟:        (1)獲取目標特徵。這裡特徵是指從不同的距離或角度進行觀察室,維持特徵的外觀的一點。例如,各角通常具備此類特徵。        (2)針對各特徵集獲取描述符,此處,描述符表示為與特徵相關的資料向量。需要注意的是,某些特徵並不適合生成描述符,因此與特徵相比,影象包含較少的描述符。        (3)獲取兩個描述符集合間的匹配項。若假設將描述符視為多維空間的資料點,則匹配結果將根據點間的距離加以定義。其中,彼此接近的描述符視為匹配。        (4)獲取參考影象和空間匹配影象間的單應性(homography)。這裡,單應性是指一類3D轉換,並可排列兩幅投影后的2D影象(或足夠接近以對二者進行排列)。該過程根據兩幅影象的匹配特徵點進行計算。當對矩形採用但應性時,即可獲得跟蹤影象的輪廓線。         關於本文中相機緩衝和Filter的使用請參考:  Android OpenCV獲取相機並拍(Android Studio)
    言歸正傳,下面介紹影象檢測的ImageDetectionFilter,先上構造方法:
public ImageDetectionFilter(Context context, int referenceImageResourceID) throws IOException {

// Load the reference image from the app's resources.
// It is loaded in BGR (blue, green, red) format.
mReferenceImage = Utils.loadResource(context, referenceImageResourceID
, Imgcodecs.CV_LOAD_IMAGE_COLOR);
// Create grayscale and RGBA versions of the reference image.
Mat referenceImageGray = new Mat();
Imgproc.cvtColor(mReferenceImage, referenceImageGray, Imgproc.COLOR_BGR2GRAY);
Imgproc.cvtColor(mReferenceImage, mReferenceImage, Imgproc.COLOR_BGR2RGBA);
// Store the reference image's corner coordinates, in pixels.
mReferenceCorners.put(0, 0, new double[]{0.0, 0.0});
mReferenceCorners.put(1, 0, new double[]{referenceImageGray.cols(), 0.0});
mReferenceCorners.put(2, 0, new double[]{referenceImageGray.cols(), referenceImageGray.rows()});
mReferenceCorners.put(3, 0, new double[]{0.0, referenceImageGray.rows()});
// Detect the reference features and compute their
// descriptors.
mFeatureDetector.detect(referenceImageGray, mReferenceKeypoints);
mDescriptorExtractor.compute(referenceImageGray, mReferenceKeypoints, mReferenceDescriptors);
}
       程式碼中首先根據傳入的參考影象資源生成Mat物件,然後生成灰度圖和RGBA儲存在成員變數中,另外,將影象的角點,特徵以及描述符也一併儲存。         初始化完成以後,接下來就是apply方法,該方法在獲取每一幀時都會被呼叫,進行影象檢測,程式碼如下:
@Override
public void apply(Mat src, Mat dst) {

// Convert the scene to grayscale.
Imgproc.cvtColor(src, mGraySrc, Imgproc.COLOR_RGBA2GRAY);
// Detect the scene features, compute their descriptors,
// and match the scene descriptors to reference descriptors.
mFeatureDetector.detect(mGraySrc, mSceneKeypoints);
mDescriptorExtractor.compute(mGraySrc, mSceneKeypoints, mSceneDescriptors);
mDescriptorMatcher.match(mSceneDescriptors, mReferenceDescriptors, mMatches);
// Attempt to find the target image's corners in the scene.
findSceneCorners();
// If the corners have been found, draw an outline around the
// target image.
// Else, draw a thumbnail of the target image.
draw(src, dst);
}
        在該方法中,首先向獲取到的影象取灰度圖,接著講灰度圖進行特徵檢測,描述符檢測以及描述符匹配。隨後,呼叫findSceneCorners方法獲取跟蹤目標的四個角(若存在的話),並繪製四邊形輪廓。最後呼叫draw()方法,在左上角繪製目標影象的縮圖。
專案Github地址:https://github.com/BruceT2010/OpenCV4AndroidSecondSight