`
郑睿9
  • 浏览: 161792 次
  • 性别: Icon_minigender_2
  • 来自: 浙江
社区版块
存档分类
最新评论

Android平台上利用opencv进行图像的边沿检测

阅读更多

 最近开始接触opencv for Android,从网上down了图像的边沿检测的代码。

 

测试图片:

 

 http://dl.iteye.com/upload/picture/pic/105498/dd5b230c-ceac-3d38-9ad2-8e4215b82a22.jpg

在Android2.3.1模拟器上跑了,如下:

 

 

代码如下:

 

package cn.netjava.opencv;

import java.io.File;

import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;




import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class TestOpencv extends Activity {

	private Button deal_button, recall_button;
	private ImageView imageview;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		double scale = 0.1;
		imageview =  (ImageView)this.findViewById(R.id.imageView1);
		Bitmap bm1=BitmapFactory.decodeFile("/sdcard/girl.jpg");
		imageview.setImageBitmap(bm1);
		Mat img = Highgui.imread("/sdcard/girl.jpg",0);
		
		Size dsize = new Size(img.width()*scale,img.height()*scale);
		Mat img2 = new Mat(dsize,CvType.CV_8SC1);
		Mat img3 = new Mat();
		img.convertTo(img2, CvType.CV_8SC1);
		Imgproc.Canny(img, img3, 123, 250);
		
		boolean flag=Highgui.imwrite("/sdcard/new.jpg", img3);
		if(flag)
		{
			File f = new File("/sdcard/new.jpg");
			if(f.exists())
			{
				Bitmap bm=BitmapFactory.decodeFile("/sdcard/new.jpg");
				imageview.setImageBitmap(bm);
			}
		}//end if
		else{
		Toast.makeText(TestOpencv.this, "===========图片写入失败!============!!", 3).show();
		}
	}
}

 

 

但自己在实践过程中,一个小问题着实费了我一番功夫。

将进行转化的矩阵写到sdcard中,总是写不进去。

弄了很多,多亏一学姐指点,程序对sdcard进行操作时,要在XML文件中进行权限控制。

 

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

 在AndroidManifest.xml中加入上面两行代码一切OK啦~

分享到:
评论
8 楼 郑睿9 2013-12-17  
ron.luo 写道
哥们有源码吗?分享下..

首先声明下,请叫我姐姐。
然后,弱弱的问一句,我不是已经在博文中公布了java代码了吗?
7 楼 ron.luo 2013-12-06  
哥们有源码吗?分享下..
6 楼 郑睿9 2013-12-02  
chenzheng_java 写道
你好,我测试你的例子的时候发现了一个错误,请问是什么问题。java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.highgui.Highgui.imread_0:(Ljava/lang/String;I)
说是本地方法没有找到.是不是除了导入OpenCV Library - 2.4.6这个之外,还需要导入一些so文件啊。麻烦帮忙看下。


opencv版本确保正确?导入是否正确?
5 楼 chenzheng_java 2013-11-29  
你好,我测试你的例子的时候发现了一个错误,请问是什么问题。java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.highgui.Highgui.imread_0:(Ljava/lang/String;I)
说是本地方法没有找到.是不是除了导入OpenCV Library - 2.4.6这个之外,还需要导入一些so文件啊。麻烦帮忙看下。
4 楼 郑睿9 2013-10-21  
Deicide3210 写道
请问要想在一个工程里使用opencv的api,是不是先把opencv library export成jar,然后右击工程文件夹,在java build path里add external JARs就可以了?我就是这样做的,编译没问题,可运行的时候一到用到opencv的那个界面,程序就被强制关闭了。查看日志,日志第二条是“Could not find class 'org.opencv.core.Mat',referenced from method XXXX”.是我的jar包有问题,还是少了什么步骤?还望大神指点。。感激不尽
刚才把您的程序拷过去试了下,发现还是无法调用opencv的api,怀疑是设置的问题。。等您有时间能教教我是怎么在eclipse里设置opencv的吗?


不需打包成jar包,只需要把opencv library引入你的eclipse的workspace中。需要用到opencv库的项目通过java build path添加路径就OK。
3 楼 Deicide3210 2013-04-20  
请问要想在一个工程里使用opencv的api,是不是先把opencv library export成jar,然后右击工程文件夹,在java build path里add external JARs就可以了?我就是这样做的,编译没问题,可运行的时候一到用到opencv的那个界面,程序就被强制关闭了。查看日志,日志第二条是“Could not find class 'org.opencv.core.Mat',referenced from method XXXX”.是我的jar包有问题,还是少了什么步骤?还望大神指点。。感激不尽
刚才把您的程序拷过去试了下,发现还是无法调用opencv的api,怀疑是设置的问题。。等您有时间能教教我是怎么在eclipse里设置opencv的吗?
2 楼 郑睿9 2013-04-09  
airflyfaith 写道
[size=x-large][size=small]您好!
我看了您的程序代码,受用很大,按照您的去做,但是imread函数总是调用不成功,请问是什么原因呢?
[/size][/size]


如果要调用imread函数,应该在Android Manifest中设置相应的权限。

<!-- 在SDCard中创建与删除文件权限 --> 
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
<!-- 往SDCard写入数据权限 --> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

上面这段代码是对SD卡设置写入操作,如果你想用imread函数,只需找到SD相应的权限进行设置就可以了。

PS:好久没登了,现在才看见,不好意思。
1 楼 airflyfaith 2013-01-25  
[size=x-large][size=small]您好!
我看了您的程序代码,受用很大,按照您的去做,但是imread函数总是调用不成功,请问是什么原因呢?
[/size][/size]

相关推荐

Global site tag (gtag.js) - Google Analytics