доступ к переменной от другого класса

Попробуйте эту простую функцию в python, которая использует opencv. просто передайте изображение и укажите желаемый размер квадрата.

def get_square(image,square_size):

    height,width=image.shape
    if(height>width):
      differ=height
    else:
      differ=width
    differ+=4

    mask = np.zeros((differ,differ), dtype="uint8")   
    x_pos=int((differ-width)/2)
    y_pos=int((differ-height)/2)
    mask[y_pos:y_pos+height,x_pos:x_pos+width]=image[0:height,0:width]
    mask=cv2.resize(mask,(square_size,square_size),interpolation=cv2.INTER_AREA)

    return mask 

использование: squared_image = get_square (image, 28)

объяснение: функция принимает ввод любого размера и создает пустое изображение в форме квадрата, превышающее высоту входного изображения и ширина. затем он помещает исходное изображение в центр пустого изображения. а затем он изменяет размер этого квадратного изображения до желаемого размера, чтобы сохранить форму исходного изображения.

надеюсь, это поможет тебе

29
задан coobird 21 June 2009 в 00:58
поделиться

4 ответа

Вы можете сделать переменные общедоступными полями:

  public int width;
  public int height;

  DrawFrame() {
    this.width = 400;
    this.height = 400;
  }

Затем вы можете получить доступ к переменным следующим образом:

DrawFrame frame = new DrawFrame();
int theWidth = frame.width;
int theHeight = frame.height;

Однако лучшим решением было бы сделать переменные частными полями добавьте два метода доступа к вашему классу, сохраняя данные в классе DrawFrame инкапсулированными:

 private int width;
 private int height;

 DrawFrame() {
    this.width = 400;
    this.height = 400;
 }

  public int getWidth() {
     return this.width;
  }

  public int getHeight() {
     return this.height;
  }

Затем вы можете получить ширину / высоту следующим образом:

  DrawFrame frame = new DrawFrame();
  int theWidth = frame.getWidth();
  int theHeight = frame.getHeight();

Я настоятельно рекомендую вам использовать последний метод.

44
ответ дан 28 November 2019 в 01:36
поделиться

Надеюсь, я правильно понимаю проблему, но похоже, что у вас нет обратной ссылки на ваш объект DrawFrame из DrawCircle.

Попробуйте следующее:

Измените свой подпись конструктора для DrawCircle, чтобы принять объект DrawFrame. В конструкторе установите переменную класса «d» для только что принятого объекта DrawFrame. Теперь добавьте методы getWidth / getHeight в DrawFrame, как упоминалось в предыдущих ответах. Посмотрите, позволяет ли это получить то, что вы ищете.

Ваш конструктор DrawCircle должен быть изменен на что-то вроде:

public DrawCircle(DrawFrame frame)
{
    d = frame;
    w = 400;
    h = 400;
    diBig = 300;
    diSmall = 10;
    maxRad = (diBig/2) - diSmall;
    xSq = 50;
    ySq = 50;
    xPoint = 200;
    yPoint = 200;
}

Последняя строка кода в DrawFrame должна выглядеть примерно так:

contentPane.add(new DrawCircle(this));

Затем попробуйте использовать d .getheight (), d.getWidth () и так далее в DrawCircle. Это предполагает, что у вас все еще есть эти методы в DrawFrame для доступа к ним, конечно.

0
ответ дан 28 November 2019 в 01:36
поделиться

Я пробовал создать объект, пробовал используя .getWidth и .getHeight, но не могу заставить его работать.

Это потому, что вы не устанавливаете поля ширины и высоты в JFrame, но вы устанавливаете их для локальных переменных. Поля HEIGHT и WIDTH наследуются от ImageObserver

Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH

См. http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html

Если ширина и высота представляют состояние фрейма, вы можете преобразовать их в поля, и напишите для них геттеры.

Затем вы можете создать конструктор, который получает оба значения в качестве параметров

public class DrawFrame extends JFrame {
 private int width;
 private int height;

 DrawFrame(int _width, int _height){

   this.width = _width;
   this.height = _height;

   //other stuff here
}
 public int getWidth(){}
 public int getHeight(){}

 //other methods
}

Если ширина и высота будут постоянными (после создания), тогда вы должны использовать модификатор final . Таким образом, как только им присвоено значение, они не могут быть изменены.

Кроме того, переменные, которые я использую в DrawCircle, если они у меня конструктор или нет?

То, как он написан сейчас, позволит вам создать круг только одного типа . Если вы не хотите создавать разные круги, вам следует перегрузить конструктор одним с аргументами).

Например, если вы хотите изменить атрибуты xPoint и yPoint, у вас может быть конструктор

public DrawCircle(int _xpoint, int _ypoint){
  //build circle here.
 }

EDIT:

Where does _width and _height come from?

] Это аргументы конструкторам. Вы устанавливаете для них значения, когда вызываете метод Constructor.

В DrawFrame я устанавливаю ширину и высоту. В DrawCircle мне нужно получить доступ к ширина и высота DrawFrame. Как делать Я делаю это?

DrawFrame(){
   int width = 400;
   int height =400;

   /*
   * call DrawCircle constructor
   */
   content.pane(new DrawCircle(width,height));

   // other stuff

}

Теперь, когда конструктор DrawCircle выполнится, он получит значения, которые вы использовали в DrawFrame как _width и _height соответственно.

EDIT:

Попробуйте выполнить

 DrawFrame frame = new DrawFrame();//constructor contains code on previous edit.
 frame.setPreferredSize(new Dimension(400,400));

http: //java.sun. com / docs / books / tutorial / uiswing / components / frame.html

1
ответ дан 28 November 2019 в 01:36
поделиться

если вам нужны ширина и высота рамки в круге, почему бы не передать ширину и высоту DrawFrame в конструктор DrawCircle:

public DrawCircle(int w, int h){
    this.w = w;
    this.h = h;
    diBig = 300;
    diSmall = 10;
    maxRad = (diBig/2) - diSmall;
    xSq = 50;
    ySq = 50;
    xPoint = 200;
    yPoint = 200;
}

вы также можете добавить пару новых методов в DrawCircle:

public void setWidth(int w) 
   this.w = w;

public void setHeight(int h)
   this.h = h; 

или даже:

public void setDimension(Dimension d) {
   w=d.width;
   h=d.height;
}

, если вы пойдете по этому маршруту, вам нужно будет обновить DrawFrame, чтобы создать локальную переменную DrawCircle для вызова этих методов.

edit:

при изменении конструктор DrawCircle, как описано в верхней части моего сообщения, не забудьте добавить ширину и высоту к вызову конструктора в DrawFrame:

public class DrawFrame extends JFrame {
 public DrawFrame() {
    int width = 400;
    int height = 400;

    setTitle("Frame");
    setSize(width, height);

    addWindowListener(new WindowAdapter()
    {
            public void windowClosing(WindowEvent e)
            {
                    System.exit(0);
            }
    });

    Container contentPane = getContentPane();
    //pass in the width and height to the DrawCircle contstructor
    contentPane.add(new DrawCircle(width, height));
 }
}
0
ответ дан 28 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: