Попробуйте эту простую функцию в 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)
объяснение: функция принимает ввод любого размера и создает пустое изображение в форме квадрата, превышающее высоту входного изображения и ширина. затем он помещает исходное изображение в центр пустого изображения. а затем он изменяет размер этого квадратного изображения до желаемого размера, чтобы сохранить форму исходного изображения.
надеюсь, это поможет тебе
Вы можете сделать переменные общедоступными полями:
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();
Я настоятельно рекомендую вам использовать последний метод.
Надеюсь, я правильно понимаю проблему, но похоже, что у вас нет обратной ссылки на ваш объект 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 для доступа к ним, конечно.
Я пробовал создать объект, пробовал используя .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
если вам нужны ширина и высота рамки в круге, почему бы не передать ширину и высоту 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));
}
}