创建一个可以充当另一个类的类

时间:2015-04-28 15:35:46

标签: java opencv processing

对于我想问的问题,我真的没有词汇量。这是我的问题:我正在使用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 Rectangle?我尝试创建一个具有属性x,y,width,height的类,这似乎是它的全部,但它表示无法从Rectangle []转换为tracking.Trackbox []

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

2 个答案:

答案 0 :(得分:2)

简短的回答是否定的。你不能简单地从一个类转换为另一个类。 opencv.detect()行返回一个Rectangles数组,这就是你必须使用的内容。

但是,您可以创建一个扩展 Rectangle的类。然后,您可以通过复制构造函数将数组中的每个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();
   }
}

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

答案 1 :(得分:0)

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

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

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