实时检测图像中的主要边缘 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后,屏幕中会出现红色线条,表示当前图像中主要的边缘。

现在对核心函数onCameraFrame做些解释:
01 @Override02 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,这两点就必定无法在一条线上
MAXLINEGAP: 在一条线中,两点的最大间隔。如果两点间的间隔超过了MAXLINEGAP,这两点就必定无法在一条线上
第9行 HOUGH_LINE_COUNT表示需要画出的最大主要边缘数。
背景:
根据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 @Override02 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,这两点就必定无法在一条线上
MAXLINEGAP: 在一条线中,两点的最大间隔。如果两点间的间隔超过了MAXLINEGAP,这两点就必定无法在一条线上
第9行 HOUGH_LINE_COUNT表示需要画出的最大主要边缘数。