【问题标题】:Create a class that can act as another创建一个可以充当另一个类的类
【发布时间】:2015-04-28 15:35:46
【问题描述】:

对于我要问的问题,我真的没有词汇量。这是我的问题:我正在使用 OpenCV(Java/Processing 库)。我的代码检测一张脸(如果有的话),然后在它周围画一个矩形,很好的起点。

import gab.opencv.*;
import processing.video.*;
import java.awt.*;

Capture video;
OpenCV opencv;

void setup() {
  size(640, 480);
  video = new Capture(this, 640/2, 480/2);
  opencv = new OpenCV(this, 640/2, 480/2);
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);  

  video.start();
}

void draw() {
  scale(2);
  opencv.loadImage(video);

  image(video, 0, 0 );

  noFill();
  stroke(0, 255, 0);
  strokeWeight(3);
  Rectangle[] faces = opencv.detect();
  println(faces);

  for (int i = 0; i < faces.length; i++) {
    //println(faces[i].x + "," + faces[i].y);
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
  }
}

void captureEvent(Capture c) {
  c.read();
}

我的问题是关于 Rectangle[] faces = opencv.detect();

是否可以创建我自己的类来代替 Java 矩形?我尝试创建一个具有 x,y,width,height 属性的类,这似乎是所有属性,但它说不能从 Rectangle[] 转换为 tracking.Trackbox[]

基本上,我想扩展 Rectangle 类的功能,以便我可以插入 x、y、w、h 并使其更平滑等等。

【问题讨论】:

  • java.awt.Rectangle 不是 final。你可以扩展它或匿名化。
  • 您可以创建一个扩展 Rectangle 的类并使用它。例如,MyRectangle 类扩展 Rectange { ... }

标签: java opencv processing


【解决方案1】:

简短的回答是否定的。你不能像那样简单地从一个类转换到另一个类。 opencv.detect() 行返回一个矩形数组,所以这就是你必须使用的。

但是,您可以创建一个扩展矩形的类。然后,您可能通过复制构造函数将数组中的每个 Rectangle 转换为您的扩展类:

class MyRectangle extends Rectangle{
   public MyRectangle(Rectangle r){
      super(r); //use the copy constructor in the Rectangle class
   }

   //then you could add your own methods
   public int getArea(){
      return getWidth() * getHeight();
   }
}

然后你需要将 Rectangle 数组转换为 MyRectangle 数组,方法是遍历数组并使用复制构造函数创建一个新数组:

Rectangle[] faces = opencv.detect();
MyRectangle[] converted = new MyRectangle[faces.length];
for(int i = 0; i < faces.length; i++){
   converted[i] = new MyRectangle(faces[i]);
}

请注意,这只是执行此操作的一种方式。您还可以创建一个包含 Rectangle 的类,然后使用它来执行自定义操作。像这样的:

class MyRectangle{
   private Rectangle r;

   public MyRectangle(Rectangle r){
      this.r = r;
   }

   public int getArea(){
      return r.getWidth()*r.getHeight();
   }
}

您采用哪种方法取决于您希望如何组织代码,但这些是基础。

【讨论】:

  • 非常感谢!也很棒的头像 B^) 现在我想知道,如果我最后只需要转换它,为什么还要扩展这个类?我可以改为迭代并执行 newClass[i].width = faces[i].width 等。不是吗?
  • @prismspecs 你完全可以这样做。扩展的原因是您可以将您的类传递给任何需要 Rectangle 实例的函数。这完全取决于你。
【解决方案2】:

关键是你的作业的左侧不会改变“右侧发生的事情”:opencv.detect() 是按原样实现的;返回类 Rectangle 的对象。显然,“矩形”不是“TrackBox”;因此您最终会遇到此类强制转换异常。

改变它的唯一方法是改变该方法的实现;但是当然,这在这里是不可能的;鉴于您不拥有该方法。

你可以做些什么:使用“包装器”模式;并创建一个包含“矩形”对象的类;但为该包装类的用户提供了一个“不同”的接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多