原理简介

3D图片分为左右图和上下图,本程序的主要目的是将图片判断是左右图、上下图还是2D图片。原理采用灰度直方图匹配的方式,首先将图片分割为左右图,判断是否类似,然后将图片分割为上下图,判断是否类似,最终将得到的结果进行分析,得出最后结果。本程序中阈值选择为0.1.

代码实现

关键代码如下:
   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)

运行效果如下:


代码下载

http://download.csdn.net/detail/xiaowang0924/9456408

Android OpenCV 3D图片智能识别相关推荐

  1. Android OpenCV实现图片叠加,水印

    关于如何用纯OpenCV实现图片叠加的例子实在是太少,太多的是使用 C++,JNI实现的,如果要用C++的话,我们为啥不转行做C++ 下面的例子基于 Android JavaCV 实现了在im_bea ...

  2. 艺赛旗(RPA)使用 opencv 进行图片颜色识别

    艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 场景:在长城证券 POC 测试中在机器人点击某个节点的 ...

  3. Android OpenCV + tess-two 实现身份证识别

    目录 效果展示 关键代码 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:andro ...

  4. 计算机毕业设计SpringBoot+Vue.js学前教育图片智能识别系统(百度AI平台)

    功能 本系统七个部分分别是用户管理模块.用户信息模块.用户留言模块.管理员模块.图片识别模块.学习收藏模块,它们的功能如下: (1) 用户管理模块 用户管理模块包含了注册(账号.昵称.密码).登录(不 ...

  5. opencv+python 图片文字识别

    # coding:utf8 import numpy as np import cv2 from PIL import Image import pytesseract import sys # 读取 ...

  6. Android之——史上最简单最酷炫的3D图片浏览效果的实现

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48052709 如今,Android开发已经成为移动互联开发领域中一支不可或缺的力量 ...

  7. opencv裁剪图片_前端智能化实践——从图片识别UI样式

    导语:前端智能化,就是通过AI/CV技术,使前端工具链具备理解能力,进而辅助开发提升研发效率,比如实现基于设计稿智能布局和组件智能识别等. 本文要介绍的是我在前端智能化的实践:通过计算机视觉技术实现自 ...

  8. pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4239字,预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型,然后在Windows平台用C++ OpenCV D ...

  9. Android OpenCV 身份证识别实战

    1.识别流程 手机获取身份证图片 计算机图片身份证号码所在的区 需要用到OpenCV,进行图像处理 OCR文本训练 记忆样本移植 图像文字识别 使用Tesseract-OCR文字 所以身份证别的关键: ...

最新文章

  1. python多线程网络编程_python网络编程之线程
  2. 4.1.2 私有成员与公有成员
  3. 把列表变成列向量_线性代数的本质11 抽象向量空间
  4. Vue.js过滤器概述
  5. 前端知识点梳理(二)
  6. 同学,解决下这个 Bug!
  7. javafx swing_Swing应用程序中的JavaFX 8 DatePicker
  8. id和instancetype的区别
  9. 前端学习(527):等分布局第二种方案
  10. java optional用法_2019年 Java 调查报告:“被取代”是不存在的!
  11. 作者:​邵蓥侠(1988-),男,博士,北京明略软件系统有限公司技术经理。...
  12. JavaScript parseInt() 函数
  13. My sql 存储过程实例
  14. 取石子游戏,威佐夫博弈的推理
  15. 计算机联锁的英语文献,计算机联锁参考文献
  16. simulink PID自动整定
  17. Golang 流媒体音视频网络传输开源项目-LAL
  18. java到达时间后自动执行代码_java设置按时间自动执行
  19. 捷多邦6层板阻抗及压合设计
  20. 【详解】软件工程中的有效性威胁(Threats to validity)到底是什么?

热门文章

  1. 新房收房时哪些注意事项--装修史上最细规则
  2. 使用Google 相册API
  3. 说说家乡的互联网 主题有奖征文【已结束】
  4. 计算机维修社团,计算机协会义务维修活动活动总结_社团活动总结
  5. js 删除对象中的属性
  6. linux mint18 +nvidia GTX 1060+CUDA 9.0
  7. SaltStack Grains 使用指南
  8. DASCTF x SU 春季挑战赛
  9. 优秀的GPS定位系统源码对开发者意味着什么
  10. 最简单的RPC框架实现