天天看點

實時檢測圖像中的主要邊緣 opencv for Android

背景:

根據

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghlinesp

,實作了在Android的相機實時捕捉螢幕中,抽取目前畫面中主要邊緣的功能。算法上先使用了Canny算法對圖像進行邊緣檢測,再使用probalistic

Hough transform抽取最主要的邊緣。

源碼下載下傳:

https://db.tt/UbLvwORc

 基于OpenCV for Android Library 2.4.6

APP介紹

打開app後,螢幕中會出現紅色線條,表示目前圖像中主要的邊緣。

實時檢測圖像中的主要邊緣 opencv for Android
實時檢測圖像中的主要邊緣 opencv for Android

現在對核心函數onCameraFrame做些解釋:

01 @Override

02 public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

03   

 mRgba = inputFrame.rgba();

04   

 mGray = inputFrame.gray();

05   

 Mat cannyMat = new Mat();

06   

 Imgproc.Canny(mGray, cannyMat, HYSTERESIS_THRESHOLD1, HYSTERESIS_THRESHOLD2, 3, false);

07   

 Imgproc.HoughLinesP(cannyMat, lines, 1, Math.PI/180, ACCUMULATOR_THRESHOLD, MINLINELENGTH, MAXLINEGAP);

08   

09   

 for (int x = 0; x < lines.cols() && x < HOUGH_LINE_COUNT; x++) {

10   

       double[] vec = lines.get(0, x);

11   

       if(vec!=null) {

12   

           double x1 = vec[0], 

13   

                   y1 = vec[1],

14   

                   x2 = vec[2],

15   

                   y2 = vec[3];

16   

           Point start = new Point(x1, y1);

17   

           Point end = new Point(x2, y2);

18   

           Core.line(mRgba, start, end, new Scalar(255,0,0), 3);

19   

       }

20   

 }

21   

22   

 return mRgba;

23 }

第6行 Imgproc.Canny()函數中的參數解釋:

mGray 待處理矩陣,即目前frame傳回的gray型Mat。Canny算法接收的輸入必須是gray型的Mat

cannyMat 結果矩陣

HYSTERESIS_THRESHOLD1: 低于該門檻值的點将不算作邊緣

HYSTERESIS_THRESHOLD2: 高于該門檻值的點将算作邊緣

若某個點A的值處于HYSTERESIS_THRESHOLD1和HYSTERESIS_THRESHOLD2之間,隻有當點A連接配接着一個高于HYSTERESIS_THRESHOLD2的點B的時候,點A才算作邊緣。

後面兩個參數沒有過多研究,請參考:

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html#steps

第7行 Imgproc.HoughLinesP()函數中,後三個參數解釋:

ACCUMULATOR_THRESHOLD: 一個設定的門檻值,如果一條線超過了該門檻值,說明該線為圖中的主要邊緣

MINLINELENGTH: 最小邊緣長度

MAXLINEGAP: 在一條線中,兩點的最大間隔。如果兩點間的間隔超過了MAXLINEGAP,這兩點就必定無法在一條線上

第9行 HOUGH_LINE_COUNT表示需要畫出的最大主要邊緣數。

繼續閱讀