
下面这个实例演示了使用OpenCV在Android手机上使用LoG算子检测边缘。
实例功能
此实例主要通过使用Imgproc的filter2D()方法操作LoG算子,实现检测图像的轮廓边缘。LoG边缘检测算子是David Courtnay Marr和Ellen Hildreth于1980年共同提出的,也称为边缘检测算法或Marr & Hildreth算子;该算法首先对图像做高斯滤波,然后再求其拉普拉斯(Laplacian)二阶导数,即图像与 Laplacian of the Gaussian function 进行滤波运算,最后通过检测滤波结果的零交叉(Zero crossings)可以获得图像或物体的边缘,因而也被业界简称为Laplacian-of-Gaussian (LoG)算子。当实例运行之后,单击“显示原始图像”按钮,原始图像的效果如图1(a)所示。单击“检测图像边缘”按钮,图像的轮廓边缘检测结果如图1(b)所示。

■ 图1
实现代码
public void onClickButton1(View v) { //响应单击按钮“显示原始图像”
myImageView.setImageBitmap(myBitmap);
}
public void onClickButton2(View v) { //响应单击按钮“检测图像边缘”
Mat myMat=new Mat();
Utils.bitmapToMat(myBitmap,myMat);
//将原始图像转为灰度图像
Imgproc.cvtColor(myMat,myMat,Imgproc.COLOR_RGBA2GRAY);
Mat myNewMat=myMat.clone();
//初始化Mat,用于存储LoG算子数值
Mat myKernel=new Mat(5,5,CvType.CV_16SC1);
//存入LoG算子所对应的卷积矩阵数值
myKernel.put(0,0,0,0,1,0,0,
0,1,2,1,0,
1,2,-16,2,1,
0,1,2,1,0,
0,0,1,0,0);
//根据LoG算子对原始图像进行边缘检测
Imgproc.filter2D(myMat,myNewMat,-1,myKernel);
Bitmap myNewBitmap=Bitmap.createBitmap(myNewMat.width(),
myNewMat.height(), Bitmap.Config.RGB_565);
//将轮廓图像输出至myNewBitmap
Utils.matToBitmap(myNewMat,myNewBitmap);
//通过ImageView控件显示轮廓图像
myImageView.setImageBitmap(myNewBitmap);
}
}
代码说明
上面这段代码在MyCode\MySampleM20\app\src\main\java\com\bin\luo\mysample\ MainActivity.java文件中。关于Imgproc的filter2D()方法的说明请参考实例102。
此实例的完整代码在MyCode\MySampleM20文件夹中。
补充说明
在测试代码时,必须保持网络畅通。
源代码下载
关注微信公众号,后台回复关键词 “Android App开发超实用代码103” 即可获得完整源代码。
参考书籍


扫码优惠购书
《Android App开发超实用代码集锦——jQuery Mobile+OpenCV+O》
ISBN:9787302589358
作者:罗帅、罗斌
定价:99元
问题描述+解决方案+真实源码+效果截图
介绍jQuery Mobile、OpenCV、OpenGL等在Android平台运行的应用
300个实例,提供完整源代码,边看边做边学











