当前位置: 首页 > 知识库问答 >
问题:

使用JavaOpenCV库时出错

雍飞雨
2023-03-14

我最近在eclipse上使用java中的openCV,正在开发一个眼球跟踪软件,我正在使用其他人创建的基本代码,并计划对其进行tweek,但在几行代码中出现错误,无法找出原因。这是全班同学

package have;

import java.awt.*;  

import java.awt.image.BufferedImage;  
import java.io.ByteArrayInputStream;  
import java.io.IOException;  
import javax.imageio.ImageIO;  
import javax.swing.*;  
import org.opencv.core.Core;  
import org.opencv.core.Mat;  
import org.opencv.core.MatOfByte;  
import org.opencv.core.MatOfRect;  
import org.opencv.core.Point;  
import org.opencv.core.Rect;  
import org.opencv.core.Scalar;  
import org.opencv.core.Size;  
import org.opencv.highgui.Highgui;  
import org.opencv.highgui.VideoCapture;  
import org.opencv.imgproc.Imgproc;  
import org.opencv.objdetect.CascadeClassifier;  

class FacePanel extends JPanel{  
     private static final long serialVersionUID = 1L;  
     private BufferedImage image;  
     // Create a constructor method  
     public FacePanel(){  
          super();   
     }  
     /*  
      * Converts/writes a Mat into a BufferedImage.  
       *   
      * @param matrix Mat of type CV_8UC3 or CV_8UC1  
      * @return BufferedImage of type TYPE_3BYTE_BGR or TYPE_BYTE_GRAY  
      */       
     public boolean matToBufferedImage(Mat matrix) {  
          MatOfByte mb=new MatOfByte();  
          Highgui.imencode(".jpg", matrix, mb);  
          try {  
               this.image = ImageIO.read(new      ByteArrayInputStream(mb.toArray()));  
           } catch (IOException e) {  
               e.printStackTrace();  
               return false; // Error  
          }  
       return true; // Successful  
     }  
     public void paintComponent(Graphics g){  
          super.paintComponent(g);   
          if (this.image==null) return;         
            g.drawImage(this.image,10,10,this.image.getWidth(),this.image.getHeight(),     null);
      }

}  
class FaceDetector {  
     private CascadeClassifier face_cascade;  
     // Create a constructor method  
     public FaceDetector(){  
         // face_cascade=new      CascadeClassifier("./cascades/lbpcascade_frontalface_alt.xml");  
         //..didn't have not much luck with the lbp

        face_cascade=new      CascadeClassifier("./cascades/haarcascade_frontalface_alt.xml"); 
          if(face_cascade.empty())  
          {  
               System.out.println("--(!)Error loading A\n");  
                return;  
          }  
          else  
          {  
                     System.out.println("Face classifier loooaaaaaded up");  
          }  
     }  
     public Mat detect(Mat inputframe){  
           Mat mRgba=new Mat();  
           Mat mGrey=new Mat();  
      MatOfRect faces = new MatOfRect();  
      inputframe.copyTo(mRgba);  
      inputframe.copyTo(mGrey);  
      Imgproc.cvtColor( mRgba, mGrey, Imgproc.COLOR_BGR2GRAY);  
      Imgproc.equalizeHist( mGrey, mGrey );  
      face_cascade.detectMultiScale(mGrey, faces);  
      System.out.println(String.format("Detected %s faces", faces.toArray().length));  
      for(Rect rect:faces.toArray())  
      {  
          Point center= new Point(rect.x + rect.width*0.5, rect.y + rect.height*0.5 );  
          //draw a blue eclipse around face

错误从这里开始,错误代码为:“构造函数大小(double,double,int,int,Scalar)未定义”

          Size s = new Size( rect.width*0.5, rect.height*0.5), 0, 0, 360, new Scalar( 0, 0, 255 )

然后在ellipse这里我得到一个错误:“类型核中的方法ellipse(Mat,RotatedRect,Scalar,int,int)不适用于参数(Mat,Point,Size,int,int,int)

           Core.ellipse( mRgba, center,s , 4, 8, 0 );  
      }  
      return mRgba;  
 }  

}公众的眼睛{

public static void main(String arg[]) throws InterruptedException{  
  // Load the native library.  
  System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
  //or ...     System.loadLibrary("opencv_java244");       

  //make the JFrame
  JFrame frame = new JFrame("WebCam Capture - Face detection");  
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

  FaceDetector faceDetector=new FaceDetector();  
  FacePanel facePanel = new FacePanel();  
  frame.setSize(400,400); //give the frame some arbitrary size 
  frame.setBackground(Color.BLUE);
  frame.add(facePanel,BorderLayout.CENTER);       
  frame.setVisible(true);       

  //Open and Read from the video stream  
   Mat webcam_image=new Mat();  
   VideoCapture webCam =new VideoCapture(0);   

    if( webCam.isOpened())  
      {  
       Thread.sleep(500); /// This one-time delay allows the Webcam to initialize itself  
       while( true )  
       {  
         webCam.read(webcam_image);  
         if( !webcam_image.empty() )  
          {   
              Thread.sleep(200); /// This delay eases the computational load .. with little performance leakage
               frame.setSize(webcam_image.width()+40,webcam_image.height()+60);  
               //Apply the classifier to the captured image  
               webcam_image=faceDetector.detect(webcam_image);  
              //Display the image  
               facePanel.matToBufferedImage(webcam_image);  
               facePanel.repaint();   
          }  
          else  
          {   
               System.out.println(" --(!) No captured frame from webcam !");   
               break;   
          }  
         }  
        }
       webCam.release(); //release the webcam

  } //end main 

}

非常感谢您的任何帮助

共有1个答案

乐正洲
2023-03-14

如果查看OpenCV Java API,您可以看到定义的大小构造函数以及所需的参数:

http://docs.opencv.org/java/org/opencv/core/Size.html

尺寸包含两个值:高度和宽度。

因此,您的代码:

 Size s = new Size( rect.width*0.5, rect.height*0.5), 0, 0, 360, new Scalar( 0, 0, 255 )

应为:

Size s = new Size( rect.width*0.5, rect.height*0.5);

这将创建一个保持一半矩形宽度和一半矩形高度的大小。

对于椭圆方法

http://docs.opencv.org/java/org/opencv/core/Core.html

有许多变体,但您似乎希望使用以下内容:

public static void ellipse(Mat img,
       Point center,
       Size axes,
       double angle,
       double startAngle,
       double endAngle,
       Scalar color)

因此,您的代码:

Core.ellipse( mRgba, center,s , 4, 8, 0 ); 

可能只是缺少颜色标量:

 Core.ellipse( mRgba, center,s , 4, 8, 0, new Scalar(B,G,R));

其中,B、G、R是每个颜色通道的双色。

 类似资料:
  • 我使用库从系统中读取文件。我不知道我使用这个库并遇到错误。 > 我正在使用PhpStom。在行::下面有一行,注意到我:未解析的函数或方法readFile()。这意味着IDE没有弄清楚这个函数在哪里。尽管如此,我已经检查了,我没有看到任何问题。 我在运行时收到此错误: 事件。js:72投手;//未处理的“错误”事件^错误:在服务器上的errnoException(net.js:901:11)处侦听

  • 目标:我尝试使用Java数据库连接器(JDBC)教程。我目前正处于这一步。 错误:在我有JDBC教程的目录中使用shell,我输入,并得到以下错误: buildfile:/users/adam/desktop/jdbctutorial/build.xml 再次感谢!

  • 我有日蚀。 我可以用库导出jar(Export- 导出的libs放入projectName_libs文件夹。我可以为导出的库更改(在eclipse中)文件夹名吗?

  • 我正在创建一个Java库,用于其他Java项目。这些项目使用Repast Symphony,我的库也使用Repast Symphony(所以我担心这个错误是由一些冲突引起的)。一切都很好,但当我运行Repast模拟时,它抛出了 我尝试将我的库导出为jar,直接导入项目并将库添加到项目的类路径,但没有成功。我做错了什么? 这个上下文类正在我的库和项目中使用。以下是它在两个类中的使用片段: 编辑以从评

  • 我正在尝试从我创建的一个简单的联系人表单中插入数据。我正在使用phpMyAdmin 下面是PHP(出于安全考虑,我删除了define语句,但我可以毫无问题地建立到数据库的链接。) 当有人点击论坛上的submit按钮后,代码就会运行,据我所知,这是正常工作的。 该错误发生在php代码的末尾。正在输出“SLQ Insert Statement FAILD”,但未发布mysql错误。 我的数据库/表的设