通过jni调用OpenCv跟直接调用android版openCv对图片进行简单的变换

看看效果图,如果运行时提示需要安装xxxx.mamager,那么就去现在Opencvforandroid,解压以后安装相应的manager安装包就好了

这就是运行的效果,关于jni的调用就不说了,就看下他改变不同效果图的代码

package com.example.opencvdemo1;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

import com.example.openjni.ImageProc;

public class MainActivity extends Activity implements OnClickListener{
	private Button mBtn_type1,mBtn_type2,mBtn_type3,mBtn_type4,mBtn_type5,mBtn_type6,mBtn_type7,mBtn_src;
	private ImageView mIv_src;
	private Bitmap mDes_Bitmap;
	private boolean isGray = false;
	private BaseLoaderCallback loaderCallback = new BaseLoaderCallback(this) {
		public void onManagerConnected(int status) {
			switch (status) {
			case LoaderCallbackInterface.SUCCESS:
				System.loadLibrary("image_proc");
				break;
			case LoaderCallbackInterface.INIT_FAILED:

				break;

			case LoaderCallbackInterface.INSTALL_CANCELED:

				break;

			case LoaderCallbackInterface.MARKET_ERROR:

				break;

			case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:

				break;

			default:
				super.onManagerConnected(status);
				break;
			}

		};

	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
	}

	public void init(){

		mBtn_type1 = (Button)findViewById(R.id.btn_type1);
		mBtn_type2 = (Button)findViewById(R.id.btn_type2);
		mBtn_type3 = (Button)findViewById(R.id.btn_type3);
		mBtn_type4 = (Button)findViewById(R.id.btn_type4);
		mBtn_type5 = (Button)findViewById(R.id.btn_type5);
		mBtn_type6 = (Button)findViewById(R.id.btn_type6);
		mBtn_type7 = (Button)findViewById(R.id.btn_type7);
		mBtn_src = (Button)findViewById(R.id.btn_src);
		mIv_src = (ImageView)findViewById(R.id.iv_img);
		mDes_Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
		mIv_src.setImageBitmap(mDes_Bitmap);
		mBtn_type1.setOnClickListener(this);
		mBtn_type2.setOnClickListener(this);
		mBtn_type3.setOnClickListener(this);
		mBtn_type4.setOnClickListener(this);
		mBtn_src.setOnClickListener(this);
		mBtn_type5.setOnClickListener(this);
		mBtn_type6.setOnClickListener(this);
		mBtn_type7.setOnClickListener(this);
	}

	public Bitmap procSrc2GrayJni(){
			int w = mDes_Bitmap.getWidth();
		int h = mDes_Bitmap.getHeight();
		int [] pixels = new int [w*h];
		mDes_Bitmap.getPixels(pixels, 0, w, 0, 0, w, h);
		int[] resultInt = ImageProc.grayProc(pixels, w, h);

		Bitmap bitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);
		bitmap.setPixels(resultInt, 0, w, 0, 0, w, h);
		return bitmap;

	}
    public Bitmap procSrc2Gray(int type){
        Mat rgbMat = new Mat();
        Mat grayMat = new Mat();
       Bitmap grayBitmap = Bitmap.createBitmap(mDes_Bitmap.getWidth(), mDes_Bitmap.getHeight(), Config.RGB_565);
        Utils.bitmapToMat(mDes_Bitmap, rgbMat);//convert original bitmap to Mat, R G B.
        Imgproc.cvtColor(rgbMat, grayMat,type);//rgbMat to gray grayMat
        Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
        Log.i("TAG", "procSrc2Gray sucess...");
        return grayBitmap;
    }  

	@Override
	protected void onResume() {
		super.onResume();
		OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9,this, loaderCallback);
	}

	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.btn_type1:
			mIv_src.setImageBitmap(procSrc2Gray(Imgproc.COLOR_RGB2GRAY));
			break;
		case R.id.btn_type2:
			mIv_src.setImageBitmap(procSrc2Gray(Imgproc.COLOR_RGB2HLS));
			break;
		case R.id.btn_type3:
			mIv_src.setImageBitmap(procSrc2Gray(Imgproc.COLOR_RGB2HSV));
			break;
		case R.id.btn_type4:
			Log.e("TAG", "procSrc2Gray sucess...");
			mIv_src.setImageBitmap(procSrc2Gray(Imgproc.COLOR_RGB2Lab));
			break;
		case R.id.btn_type5:
			mIv_src.setImageBitmap(procSrc2Gray(Imgproc.COLOR_RGB2Luv));
			break;
		case R.id.btn_type6:
			mIv_src.setImageBitmap(procSrc2Gray(Imgproc.COLOR_RGB2XYZ));
			break;
		case R.id.btn_type7:
			mIv_src.setImageBitmap(procSrc2Gray(Imgproc.COLOR_RGB2YUV));
			break;
		case R.id.btn_src:
			mIv_src.setImageBitmap(mDes_Bitmap);
			break;
		default:
			break;
		}
	}
}

Android openCv
Imgproc :该类是用来对图片进行处理的一个类,你可以让图片改变成你想要的样子,变成灰色的,或是素描,或是底片类型,等等,都可以。
他是通过jni调用来让我们可以在android里边能用openCv的功能。
 private static native void Canny_0(long image_nativeObj, long edges_nativeObj, double threshold1, double threshold2, int apertureSize, boolean L2gradient);
这个方法是用来找到图片边缘的。然后可以让你转换为一个类似描边的图像。里边的参数可以看到,第一个参数是要转换的图片的矩阵,第二个参数是转换以后的矩阵,第三个是阀值,第四个越是,你可以自己改变他俩个的大小看看效果,越大边缘月少。第五个参数其实也是调整显示的时候边缘化的程度了好像,我试验了一下以后
这些参数的大小在填的时候需要自己调整好,最后一个参数是用来判断是否要更准确一点。
private static native void Canny_1(long image_nativeObj, long edges_nativeObj, double threshold1, double threshold2);
这个跟上边的类似。

private static native void GaussianBlur_0(long src_nativeObj, long dst_nativeObj, double ksize_width, double ksize_height, double sigmaX, double sigmaY, int borderType);
高斯滤波器来对图片进行模糊化。第一个参数是图片原型矩阵,第二个是转换后输出矩阵,第三个为高斯滤波器模板的宽,第四个为高斯滤波器模板的高,第五第六sigmaX和sigmaY分别为高斯滤波在横线和竖向的滤波系数,borderType为边缘点插值类型。对于这个方法的使用参考http://blog.csdn.net/vblittleboy/article/details/9187447
    private static native void GaussianBlur_1(long src_nativeObj, long dst_nativeObj, double ksize_width, double ksize_height, double sigmaX, double sigmaY);
    private static native void GaussianBlur_2(long src_nativeObj, long dst_nativeObj, double ksize_width, double ksize_height, double sigmaX);
同上边

private static native void HoughCircles_0(long image_nativeObj, long circles_nativeObj, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius);

    private static native void HoughCircles_1(long image_nativeObj, long circles_nativeObj, int method, double dp, double minDist);

	/**
	 *高斯模糊处理
	 * @return
	 */
    public Bitmap gaosiBlur(){
    	   Mat rgbMat = new Mat();
           Mat grayMat = new Mat();
          Bitmap gaosiBitmap = Bitmap.createBitmap(mDes_Bitmap.getWidth(), mDes_Bitmap.getHeight(), Config.ARGB_8888);
           Utils.bitmapToMat(mDes_Bitmap, rgbMat);//convert original bitmap to Mat, R G B.
            Size size = new Size();	  //进行高斯模糊处理
           size.height = 17;
           size.width = 17;
           Imgproc.GaussianBlur(rgbMat, grayMat, size, 2, 2, Imgproc.BORDER_DEFAULT);
           Utils.matToBitmap(grayMat, gaosiBitmap); //convert mat to bitmap
           Log.i("TAG", "procSrc2Gray sucess...");  

           return gaosiBitmap;
    }
    public Bitmap getwarpPerspective(){
    	Mat srcMat = new Mat();
    	Mat dstMat = new Mat();
    	Mat perspectiveTransform = Imgproc.getPerspectiveTransform(srcMat, dstMat);
        Size size = new Size();	  //进行高斯模糊处理
        size.height = mDes_Bitmap.getHeight();
        size.width = mDes_Bitmap.getWidth();
    	Bitmap dstBitmap = Bitmap.createBitmap(mDes_Bitmap.getWidth(), mDes_Bitmap.getHeight(), Config.RGB_565);
    	Utils.bitmapToMat(mDes_Bitmap, srcMat);
    	 Core.perspectiveTransform(srcMat, dstMat, perspectiveTransform);
    	Imgproc.warpPerspective(srcMat, dstMat, perspectiveTransform, size);
    	Utils.matToBitmap(dstMat, dstBitmap);
    	return dstBitmap;

    }
    /**
     * 进行边缘检测
     * @return
     */
    public Bitmap getCanny(){
        Mat rgbMat = new Mat();
        Mat grayMat = new Mat();
       Bitmap grayBitmap = Bitmap.createBitmap(mDes_Bitmap.getWidth(), mDes_Bitmap.getHeight(), Config.ARGB_8888);
        Utils.bitmapToMat(mDes_Bitmap, rgbMat);//convert original bitmap to Mat, R G B.
      Imgproc.Canny(rgbMat, grayMat,0,150);  //对图片进行边缘检测
      Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
      Log.i("TAG", "procSrc2Gray sucess...");
      return grayBitmap;
    }

Demo:http://download.csdn.net/detail/u012808234/9374169

时间: 2024-10-17 09:18:38

通过jni调用OpenCv跟直接调用android版openCv对图片进行简单的变换的相关文章

android相机拍照后上传到指定文件夹,opencv是通过调用文件夹里图片进行处理的吗?

问题描述 android相机拍照后上传到指定文件夹,opencv是通过调用文件夹里图片进行处理的吗? 现在有一个Android拍照上传到指定文件夹的程序和一个opencv图像匹配的程序,能否通过修改某些语句和配置环境可以将两者结合?如果可以求大神赐教!(opencv是在文件夹选取图片进行匹配的.) 解决方案 可以直接调用文件夹里的图片处理,配置的话把路径配置成相对路径就可以了

弱弱地问一下:opencv都可以调用普通的免驱笔记本外接摄像头吗?

问题描述 弱弱地问一下:opencv都可以调用普通的免驱笔记本外接摄像头吗? 如题~直接cvCaptureFromCAM....巴拉巴拉就可以直接调用了吗(想买个笔记本外接摄像头) 解决方案 看看这个能不能用到,http://blog.sina.com.cn/s/blog_4a189c920101cm8v.html

x-图像的直方图显示。opencv.不同于调用直方图函数

问题描述 图像的直方图显示.opencv.不同于调用直方图函数 for (int i = 0; i<img.rows; i++) { for (int j = 0; j<img.cols; j++) { x[img.at<uchar>(i, j)]++;//求到的像素点的灰度值 } } 怎样自己建立坐标,将横坐标灰度值,纵坐标灰度值的个数或者是概率显示出来..因为图像是16位的,范围是0~65536的,用书上的函数只能处理8位或者32的,,,,,求解惑啊

图片-opencv初学者 为什么调用摄像头 怎么出现捕获源什么框框的。。。

问题描述 opencv初学者 为什么调用摄像头 怎么出现捕获源什么框框的... 用的opencv 4.8 和vs 2010 这是调用的那个cpp代码 /*打开摄像头,通过摄像头进行实时人数统计*/ #include "peoplecounting.h" #include "cv.h" #include "highgui.h" #include "cxcore.h" #include "cvaux.h" #i

opencv摄像头属性调用

问题描述 opencv摄像头属性调用 请教各位高手 opencv里如何调用摄像头驱动自带的"视频属性对话框"和"输入属性对话框"啊

android版sdk,调用登录接口函数之后不进回调(如onSuccess,或onError),也捕捉不到异常。

问题描述 问题描述:用环信sdk (android版),可以正确初始化,也可以成功的注册,第一次运行注册用户成功,以后注册都可以捕到用户已存在的异党,但是调用注册接口时,无法进入任何回调,也捕不到任何异常.不知道登录的结果是什么. 我调用SDK的过程是这样的:1. 初始化:EMChat.getInstance().init(getApplicationContext());EMChat.getInstance().setDebugMode(true);2.注册与登录try  {         

源代码-有关Android和OPENCV的问题

问题描述 有关Android和OPENCV的问题 想问一下opencv是C/C++写的,为什么可以在eclipse的android项目中使用?还有怎么查看Opencv中算法的具体的源代码? 刚接触这些,望高手们指点一下.注:我下的opencv for android 并且导入了eclipse. 解决方案 eclipse下的导入的opencv是通过某种方式编译形成一个sdk,相当于一个jar包一样的东西吧,这样就可以被Android的项目用了.我每次查看源代码的时候 首先是右击这个函数,选择ope

android-Android代码调用mysql数据库,怎样调用,webservice方法调用怎么调用

问题描述 Android代码调用mysql数据库,怎样调用,webservice方法调用怎么调用 Android客户端调用远程动态mysql数据库,要求能向里面添加数据,并能把数据库中 的数据显示到Android代码客户端,新手,希望能给点给点demo参考一下! 解决方案 android用httpclient访问的jsp服务器端,jsp得到数据入库. 自己google android 调用web service android httpclient 以及 jsp 访问数据库 jsp 增删改查 j

异常-rmi通讯部分方法调用成功,部分调用失败

问题描述 rmi通讯部分方法调用成功,部分调用失败 rmi运行一段时间后,可能是几天也可能是几周.突然rmi客户端出现部分rmi方法调用不通.抛异常java.rmi.unmarshalException:error unmarshlling return;nested exception is; java.io.EOFException at sum.rmi.server.UnicastRef.invoke(UnicastRef.java:173)