十年经验用java实现大数据判断猫咪图片的功能并描述java的优势和劣势

avatar
作者
筋斗云
阅读量:0
main()

目录

优势

劣势


Java作为一种广泛使用的编程语言,具有许多优势和劣势。以下是我十年经验对Java优势和劣势的描述:

优势

  1. 跨平台性(平台无关性)
    • Java语言编写的程序可以在任何支持Java虚拟机的计算机上运行,实现了“一次编写,到处运行”的愿景。这得益于Java的“编译一次,到处运行”的特性,即Java代码被编译成字节码(.class文件),然后由Java虚拟机(JVM)解释执行。
  2. 面向对象
    • Java是一种纯粹的面向对象编程语言,这有助于开发人员以更自然的方式对现实世界进行建模。面向对象编程带来了许多好处,如代码重用、模块化、易于维护等。
  3. 丰富的API和框架
    • Java拥有庞大的标准库和第三方库,提供了大量的API和框架,用于构建各种类型的应用程序,包括桌面应用程序、Web应用程序、移动应用程序、分布式系统、大数据处理等。
  4. 安全性
    • Java提供了许多内置的安全特性,如垃圾回收机制、异常处理、内存管理等,有助于减少程序中的错误和漏洞。此外,Java还提供了访问控制、加密等安全机制,可以保护应用程序免受恶意攻击。
  5. 强大的社区支持
    • Java拥有庞大的开发者社区和丰富的资源,包括书籍、教程、在线文档、论坛等。这为Java开发者提供了强大的支持,使得他们可以更快地学习和掌握Java技术。
  6. 多线程支持
    • Java内置了对多线程的支持,使得开发者可以轻松地编写并发程序。多线程技术对于提高程序的性能和响应速度至关重要。

劣势

  1. 性能开销
    • 由于Java是一种解释型语言,并且需要在JVM上运行,这可能导致Java程序的性能略低于直接编译成机器代码的C或C++程序。然而,随着JVM技术的不断发展,这种性能差距正在逐渐缩小。
  2. 内存消耗
    • Java程序在运行时需要占用更多的内存资源,因为JVM需要为其分配一定的内存空间。这可能导致在一些资源受限的环境中,Java程序的表现不如其他语言编写的程序。
  3. 学习曲线
    • 对于初学者来说,Java的语法和面向对象编程范式可能相对复杂,需要一定的时间和实践才能掌握。此外,Java生态系统中存在大量的库和框架,学习这些库和框架也需要一定的时间和努力。
  4. 更新速度
    • 相比一些新兴的编程语言,Java的更新速度可能较慢。这意味着一些最新的编程技术和最佳实践可能首先在其他语言中实现,然后才被引入到Java中。
  5. 大型项目复杂性
    • 在大型项目中,Java的面向对象特性和丰富的API可能导致代码结构变得复杂。这可能会增加项目的维护成本和开发难度。因此,在大型项目中,合理的架构设计和代码规范至关重要。

import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.ml.Ml; import org.opencv.ml.SVM; import org.opencv.objdetect.HOGDescriptor; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; public class Win extends JFrame { JTextField tfFileName = new JTextField(" ", 30); JLabel labResult = new JLabel(); // 单个图片预测 public void svm_predict() { String img_path = new String(); // 存储图片 // 读取模型 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); SVM svm = SVM.create(); SVM model = svm.load("D:\\test\\train\\svm_java1"); try { String testFileName = tfFileName.getText().trim(); img_path = testFileName; // 读取图片 Mat src_test = Imgcodecs.imread(img_path); if (src_test.empty()) { labResult.setText("没有这张图片!!"); } else { Mat dst_test = new Mat(); Imgproc.cvtColor(src_test, dst_test, Imgproc.COLOR_BGR2GRAY); Mat testimg = dst_test.clone(); Imgproc.resize(dst_test, testimg, new Size(64, 64)); // 计算HOG特征 HOGDescriptor hog = new HOGDescriptor(new Size(64, 64), new Size(16, 16), new Size(8, 8), new Size(8, 8), 9); MatOfFloat descriptorsOfMat = new MatOfFloat(); hog.compute(testimg, descriptorsOfMat); float[] descriptor = descriptorsOfMat.toArray(); Mat testmat = new Mat(1, 1764, CvType.CV_32FC1); testmat.put(0, 0, descriptor); // 进行预测,1为正样本,-1为负样本 float p = model.predict(testmat); if (p == 1) { labResult.setText("是"); } else { labResult.setText("否"); } } } catch (Exception e) { System.err.println("read err:" + e); } } public void svm_train() { Integer ITERATION_NUM = 100; // 迭代次数(每次迭代使用所有样本,这里1个样本使用ITERATION_NUM次或者达到终止条件) String trainPostxt = "D:\\test\\train\\positive.txt"; // 正样本文件夹 String trainNegtxt = "D:\\test\\train\\negtive.txt"; // 负样本文件夹 ArrayList img_path = new ArrayList(); ArrayList img_label = new ArrayList();// 标签 正样本标签为1 负样本标签为-1 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// 加载opencv库 try { BufferedReader brP = new BufferedReader( new InputStreamReader(new FileInputStream(new File(trainPostxt)), "UTF-8")); String linetxt = null; // 存储图片名, Integer nline = 0; // 统计所有样本数 while ((linetxt = brP.readLine()) != null) { nline++; img_path.add(linetxt); // 将正样本图片名存入数组 img_label.add((float) 1.0); // 将该图片标记为1 } brP.close(); // 负样本 BufferedReader brN = new BufferedReader( new InputStreamReader(new FileInputStream(new File(trainNegtxt)), "UTF-8")); while ((linetxt = brN.readLine()) != null) { nline++; img_path.add(linetxt);// 将负样本图片名存入数组 img_label.add((float) -1.0);// 将该图片标记为-1 } brN.close(); Integer SAMPLE_COUNT = nline; // 所有样本数 Integer PICTURE_FEATURE_DIM = 1764; // 一个样本的特征维度 // 二维数组记录特征和标签 Mat data_mat = new Mat(SAMPLE_COUNT, PICTURE_FEATURE_DIM, CvType.CV_32FC1);// 这个数组按照标准形式(训练要求的形式)记录所有图片的hog特征 Mat res_mat = new Mat(SAMPLE_COUNT, 1, CvType.CV_32SC1);// 这个数组按照标准形式(训练要求的形式)记录所有图片的标签 // svm descriptors ArrayList descriptors = new ArrayList(); // 这个数组记录所有图片的hog特征 for (Integer i = 0; i < img_path.size(); i++) { Mat src = Imgcodecs.imread(img_path.get(i)); // 读取一个样本 if (src.empty()) { // 如果没有样本 System.out.println(img_path.get(i)); throw new Exception("no such picture"); } Mat dst = new Mat(); Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY); // 将图片转换为RGB格式 Mat trainimg = dst.clone();// 完全拷贝,把dst中的所有信息拷贝到trainimg中 Imgproc.resize(dst, trainimg, new Size(64, 64)); // 将图片转换成固定大小,这样才能计算相同大小的hog特征,即不同图片计算出来的hog特征不一样 //下面三行,计算HOG特征 HOGDescriptor hog = new HOGDescriptor(new Size(64, 64), new Size(16, 16), new Size(8, 8), new Size(8, 8), 9); MatOfFloat descriptorsOfMat = new MatOfFloat(); hog.compute(trainimg, descriptorsOfMat); float[] descriptor = descriptorsOfMat.toArray(); descriptors.add(descriptor); // 将一张图片的hog特征加入数组 } // 放进二维数组中 for (Integer m = 0; m < descriptors.size(); m++) { for (int n = 0; n < descriptors.get(m).length; n++) { data_mat.put(m, n, descriptors.get(m)[n]); } res_mat.put(m, 0, img_label.get(m)); } // 训练SVM SVM svm = SVM.create(); svm.setType(SVM.C_SVC); // SVM种类 svm.setKernel(SVM.LINEAR); // 核函数形式 svm.setTermCriteria(new TermCriteria(TermCriteria.MAX_ITER, ITERATION_NUM, 1e-6)); // 训练停止条件 svm.train(data_mat, Ml.ROW_SAMPLE, res_mat); // 存储模型 svm.save("D:\\test\\train\\svm_java1"); } catch (Exception e) { System.err.println("read err:" + e); } } public Win() { showWin(); } public void showWin() { setLayout(null); setBounds(200, 200, 500, 250); setTitle("27 陈梓杨"); Container c = getContentPane(); JButton btStudy = new JButton("学习"); btStudy.setBounds(60, 15, 380, 30); c.add(btStudy); JLabel lbName = new JLabel("文件名:"); lbName.setBounds(60, 70, 50, 20); c.add(lbName); tfFileName.setBounds(130, 70, 310, 30); c.add(tfFileName); JLabel lab2 = new JLabel("结果"); lab2.setBounds(60, 100, 70, 30); c.add(lab2); labResult.setBounds(130, 100, 150, 30); c.add(labResult); JButton btTest = new JButton("预测"); btTest.setBounds(60, 130, 380, 30); c.add(btTest); btStudy.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { // TODO 自动生成的方法存根 svm_train(); labResult.setText("学习完!!!"); } }); //单击btTest按钮执行事件 btTest.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { // TODO 自动生成的方法存根 svm_predict(); } }); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!