背景:
根據
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後,螢幕中會出現紅色線條,表示目前圖像中主要的邊緣。
現在對核心函數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表示需要畫出的最大主要邊緣數。