当前位置: 首页 > news >正文

手机AIDE使用OpenCV

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
需要使用OpenCV.jar和so文件

package com.example.application;import android.app.Activity;
import android.os.Bundle;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap;
import android.view.View;
import java.util.ArrayList;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.File;
import java.io.RandomAccessFile;
import java.util.Queue;
import android.graphics.Color;
import java.util.LinkedList;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.android.Utils;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.MatOfPoint;
import java.util.List;
import org.opencv.core.Scalar;
import org.opencv.core.Core;public class MainActivity extends Activity {private huabu hb;private Bitmap bitmap;static {// 加载OpenCV的.so库(库名与文件前缀一致,libopencv_java4.so对应"opencv_java4")System.loadLibrary("opencv_java4");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);hb = findViewById(R.id.huabu);if (!OpenCVLoader.initDebug()) {Toast.makeText(this, "OpenCV初始化失败", Toast.LENGTH_SHORT).show();}String str="/storage/emulated/0/脚本/Aj图片/screenshot_1759871209890.png";bitmap = BitmapFactory.decodeFile(str);}public void huiduhua(View v) {processImage();}private void processImage() {// 这里假设你要处理的图片在手机存储的指定路径,替换为实际图片路径if (bitmap == null) {Toast.makeText(this, "无法读取图片", Toast.LENGTH_SHORT).show();return;}Mat mat = new Mat();Utils.bitmapToMat(bitmap, mat);Mat grayMat = new Mat();Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_BGR2GRAY);Bitmap grayBitmap = Bitmap.createBitmap(grayMat.cols(), grayMat.rows(), Bitmap.Config.ARGB_8888);Utils.matToBitmap(grayMat, grayBitmap);hb.setbittmap(grayBitmap);}public void hualunkuo(View v) {//boolean a=colors.isSimilar("#000000", "#000010", 25);detectBlackFonts();}// 识别黑色字体的核心方法private void detectBlackFonts() {Bitmap originalBitmap = this.bitmap;if (originalBitmap == null) {Toast.makeText(this, "图片读取失败", Toast.LENGTH_SHORT).show();return;}Mat srcMat = new Mat();Utils.bitmapToMat(originalBitmap, srcMat);// 处理透明通道if (srcMat.channels() == 4) {Imgproc.cvtColor(srcMat, srcMat, Imgproc.COLOR_RGBA2BGR);}// 转为灰度图Mat grayMat = new Mat();Imgproc.cvtColor(srcMat, grayMat, Imgproc.COLOR_BGR2GRAY);// 阈值化(突出黑色字体)Mat binaryMat = new Mat();Imgproc.threshold(grayMat, binaryMat, 150, 255, Imgproc.THRESH_BINARY_INV);// 形态学操作:连接笔画Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(4, 5));Imgproc.dilate(binaryMat, binaryMat, kernel);Imgproc.erode(binaryMat, binaryMat, kernel);// 提取所有轮廓List<MatOfPoint> contours = new ArrayList<>();Mat hierarchy = new Mat();Imgproc.findContours(binaryMat, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);// 过滤有效轮廓并绘制边界矩形Scalar red = new Scalar(0, 0, 255); // 红色矩形for (MatOfPoint contour : contours) {// 1. 计算轮廓面积,过滤过小轮廓double area = Imgproc.contourArea(contour);if (area < 50) {contour.release();continue;}// 2. 获取轮廓的边界矩形(左上角和右下角坐标)org.opencv.core.Rect rect = Imgproc.boundingRect(contour);int width = rect.width;int height = rect.height;// 3. 过滤宽高比异常的矩形if (width == 0 || height == 0) {contour.release();continue;}double ratio = (double) width / height;if (ratio < 0.2 || ratio > 3.2) {contour.release();continue;}// 4. 绘制边界矩形(左上角(x1,y1),右下角(x2,y2))Imgproc.rectangle(srcMat,new org.opencv.core.Point(rect.x, rect.y), // 左上角坐标new org.opencv.core.Point(rect.x + width, rect.y + height), // 右下角坐标red, // 颜色2 // 线宽);contour.release(); // 及时释放资源}Toast.makeText(this, "完成"+contours.size(), 0).show();// 转换为Bitmap显示Mat resultMat = new Mat();Imgproc.cvtColor(srcMat, resultMat, Imgproc.COLOR_BGR2RGBA);Bitmap resultBitmap = Bitmap.createBitmap(resultMat.cols(), resultMat.rows(), Bitmap.Config.ARGB_8888);Utils.matToBitmap(resultMat, resultBitmap);hb.setbittmap(resultBitmap);// 释放剩余资源srcMat.release();grayMat.release();binaryMat.release();hierarchy.release();kernel.release();resultMat.release();}private void log(Exception e) {ByteArrayOutputStream baos = new ByteArrayOutputStream();e.printStackTrace(new PrintStream(baos));String str = baos.toString();log(str);}public Boolean log(String strcontent) {try {strcontent += "\n";String filePath="/sdcard/log.txt";File file=new File(filePath);//路径if (!file.exists()) {file.getParentFile().mkdirs();file.createNewFile();//创建txt文件}RandomAccessFile raf=new RandomAccessFile(file, "rwd");raf.seek(file.length());raf.write(strcontent.getBytes());raf.close();return true;} catch (Exception e) {}return false;}
}
http://www.dtcms.com/a/456590.html

相关文章:

  • AI智能体(Agent)大模型入门【9】--如何在pycharm等其他编译软件调用ocr工具【只写后端代码不演示】
  • 浅析SpringBoot框架常见未授权访问漏洞
  • 有什么可以做翻译的网站点的排版设计网站
  • 第五十三章 ESP32S3 TCPClient 实验
  • 中国突破柔性电池技术瓶颈:可弯折20000次引领能源存储革命
  • 网站制作公司的宣传海报品牌免费网站建设
  • 基于模板缓冲的矢量贴地显示
  • flink keyby使用与总结 基础片段梳理
  • flink UTDF函数
  • 乐陵网站开发贾汪区建设局网站
  • VS安装EEPlus库及解决[弃用的]CS0618问题
  • 《算法闯关指南:优选算法--滑动窗口》--15.串联所有单词的子串,16.最小覆盖子串
  • 行驶证识别技术通过OCR和AI实现信息自动化采集与处理,涵盖图像预处理、文字识别及结构化校验,提升效率与准确性
  • 第十七篇:数组与链表:结构特性、操作与经典题目
  • 营销型网站的优点深圳推广系统
  • 攻防世界-Web-easyupload
  • 符号主义对自然语言处理深层语义分析的影响与启示
  • 高要区住房和城乡建设局网站西安建设市场信息平台
  • 新手可以做网站营运吗成都手机模板建站
  • 成都市做网站的公司网站开发客户端
  • 农业机械网站模板网站建设图片像素是多大的
  • 素材网站php程序源码公司简介介绍
  • 网站规划的一般步骤建设企业网站包含什么
  • 奉贤做网站建设wordpress访问很慢吗?
  • 大学生网站建设开题报告免费交流网站建设
  • 邢台做网站优化哪儿好怎样建网站
  • 企业网站 asp php修改wordpress邮件
  • 宠物网站开发背景怎样自己制作效果图
  • 适合企业做外贸的几个网站商会网站模板
  • 遂溪网站开发公司建设网站需要哪些材料