Android OpenCV 3D图片智能识别
原理简介
代码实现
private static final String TAG = TDImageRecognition.class.getSimpleName();public static final int LRMODEL = 1;public static final int RLMODEL = 2;public static final int TDMODEL = 3;public static final int DTMODEL = 4;public static final int SDMODEL = 5;static {try {System.loadLibrary("tdimage");} catch (UnsatisfiedLinkError use) {Log.e(TAG, "WARNING: Could not load libtd_image.so");}}public static int imageRecognition(Bitmap bitmap) {if (bitmap == null)return 0;int w = bitmap.getWidth(), h = bitmap.getHeight();int[] pix = new int[w * h];bitmap.getPixels(pix, 0, w, 0, 0, w, h);int result = TDImageRecognition.tDImageRecognition(pix, w, h);return result;}public static native int[] imageRecognition(int[] sourceImage, int w, int h);public static native int tDImageRecognition(int[] sourceImage, int w, int h);public static native int _getVideoType(String path);
通过JNI的方式调用OPENCV进行识别
JNIEXPORT jint JNICALL Java_com_runmit_imagerecognition_utils_TDImageRecognition_tDImageRecognition(JNIEnv * env, jobject obj, jintArray buf, jint w, jint h) {std::vector<IplImage *> lrImages(2);std::vector<IplImage *> tdImages(2);int* cbuf = env->GetIntArrayElements(buf, false);IplImage* grayImage = changeArrayToGrayImage(cbuf, w, h);//截取左边图片IplImage* leftImage = splitImage(grayImage,w/2,h,0,0);//截取右边图片IplImage* rightImage = splitImage(grayImage,w/2,h,w/2,0);//上面图片IplImage* topImage = splitImage(grayImage,w,h/2,0,0);//下面图片IplImage* bottomImage = splitImage(grayImage,w,h/2,0,h/2);double lrResult = calHist(leftImage,rightImage);double tdResult = calHist(topImage,bottomImage);cvReleaseImage(&grayImage);cvReleaseImage(&leftImage);cvReleaseImage(&rightImage);cvReleaseImage(&topImage);cvReleaseImage(&bottomImage);if(lrResult <= THRESHOLD && tdResult > THRESHOLD) {return LRMODEL;}if(lrResult > THRESHOLD && tdResult <= THRESHOLD) {return TDMODEL;}return SDMODEL;
}
用到的帮助类
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include "ImageUtils.h"
using namespace cv;
extern "C" {//分割图片
IplImage* splitImage(IplImage* src, int w, int h, int origX,int origY ) {if(src == NULL) {return NULL;printf("the image is null");}CvSize size= cvSize(w, h);//区域大小cvSetImageROI(src,cvRect(origX,origY,size.width, size.height));//设置源图像ROIIplImage* pDest = cvCreateImage(size,src->depth,src->nChannels);//创建目标图像cvCopy(src,pDest); //复制图像cvResetImageROI(src);//源图像用完后,清空ROIreturn pDest;
}//
double calHist(IplImage* img1,IplImage* img2){int hist_size=256;float range[] = {0,255};float* ranges[]={range};CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);cvCalcHist(&img1,gray_hist,0,0);CvHistogram* gray_hist2 = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);cvCalcHist(&img2,gray_hist2,0,0);double result = cvCompareHist(gray_hist,gray_hist2,CV_COMP_BHATTACHARYYA);cvReleaseImage(&img1);cvReleaseImage(&img2);cvReleaseHist(&gray_hist);cvReleaseHist(&gray_hist2);return result;
}IplImage * change4channelTo3InIplImage(IplImage * src) {if (src->nChannels != 4) {return NULL;}IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);for (int row = 0; row < src->height; row++) {for (int col = 0; col < src->width; col++) {CvScalar s = cvGet2D(src, row, col);cvSet2D(destImg, row, col, s);}}cvReleaseImage(&src);return destImg;
}IplImage* changeArrayToGrayImage(int* cbuf,int w,int h) {if (cbuf == NULL) {return 0;}Mat matImage(h, w, CV_8UC4, (unsigned char*) cbuf);IplImage image = IplImage(matImage);IplImage* image3channel = change4channelTo3InIplImage(&image);IplImage* grayImage = cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);cvCvtColor(image3channel,grayImage,CV_BGR2GRAY); //关键//cvReleaseImage(&image);cvReleaseImage(&image3channel);return grayImage;}}
Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OpenCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off
OPENCV_LIB_TYPE:=STATIC
#include ../includeOpenCV.mk
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include /home/wang1/Documents/opencv/OpenCV-3.1.0-android-sdk/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE := tdimage
LOCAL_C_INCLUDES += core/include
LOCAL_SRC_FILES := \core/ImageUtils.cpp \core/TDImageRecognition.cpp \LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)
运行效果如下:
代码下载
Android OpenCV 3D图片智能识别相关推荐
- Android OpenCV实现图片叠加,水印
关于如何用纯OpenCV实现图片叠加的例子实在是太少,太多的是使用 C++,JNI实现的,如果要用C++的话,我们为啥不转行做C++ 下面的例子基于 Android JavaCV 实现了在im_bea ...
- 艺赛旗(RPA)使用 opencv 进行图片颜色识别
艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 场景:在长城证券 POC 测试中在机器人点击某个节点的 ...
- Android OpenCV + tess-two 实现身份证识别
目录 效果展示 关键代码 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:andro ...
- 计算机毕业设计SpringBoot+Vue.js学前教育图片智能识别系统(百度AI平台)
功能 本系统七个部分分别是用户管理模块.用户信息模块.用户留言模块.管理员模块.图片识别模块.学习收藏模块,它们的功能如下: (1) 用户管理模块 用户管理模块包含了注册(账号.昵称.密码).登录(不 ...
- opencv+python 图片文字识别
# coding:utf8 import numpy as np import cv2 from PIL import Image import pytesseract import sys # 读取 ...
- Android之——史上最简单最酷炫的3D图片浏览效果的实现
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48052709 如今,Android开发已经成为移动互联开发领域中一支不可或缺的力量 ...
- opencv裁剪图片_前端智能化实践——从图片识别UI样式
导语:前端智能化,就是通过AI/CV技术,使前端工具链具备理解能力,进而辅助开发提升研发效率,比如实现基于设计稿智能布局和组件智能识别等. 本文要介绍的是我在前端智能化的实践:通过计算机视觉技术实现自 ...
- pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)
学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4239字,预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型,然后在Windows平台用C++ OpenCV D ...
- Android OpenCV 身份证识别实战
1.识别流程 手机获取身份证图片 计算机图片身份证号码所在的区 需要用到OpenCV,进行图像处理 OCR文本训练 记忆样本移植 图像文字识别 使用Tesseract-OCR文字 所以身份证别的关键: ...
最新文章
- python多线程网络编程_python网络编程之线程
- 4.1.2 私有成员与公有成员
- 把列表变成列向量_线性代数的本质11 抽象向量空间
- Vue.js过滤器概述
- 前端知识点梳理(二)
- 同学,解决下这个 Bug!
- javafx swing_Swing应用程序中的JavaFX 8 DatePicker
- id和instancetype的区别
- 前端学习(527):等分布局第二种方案
- java optional用法_2019年 Java 调查报告:“被取代”是不存在的!
- 作者:​邵蓥侠(1988-),男,博士,北京明略软件系统有限公司技术经理。...
- JavaScript parseInt() 函数
- My sql 存储过程实例
- 取石子游戏,威佐夫博弈的推理
- 计算机联锁的英语文献,计算机联锁参考文献
- simulink PID自动整定
- Golang 流媒体音视频网络传输开源项目-LAL
- java到达时间后自动执行代码_java设置按时间自动执行
- 捷多邦6层板阻抗及压合设计
- 【详解】软件工程中的有效性威胁(Threats to validity)到底是什么?