我正在尝试扩展/翻译java.awt.使用AffineTransform进行形状,以便在定义的边界Rectangle中绘制它.
此外,我想在具有" 缩放 "参数的绘图区域中绘制它.
我尝试了各种AffineTransform连接,但我找不到正确的序列.例如,以下解决方案是错误的:
double zoom=(...);/* current zoom */
Rectangle2D viewRect=(...)/** the rectangle where we want to paint the shape */
Shape shape=(...)/* the original shape that should fit in the rectangle viewRect */
Rectangle2D bounds=shape.getBounds2D();
double ratioW=(viewRect.getWidth()/bounds.getWidth());
double ratioH=(viewRect.getHeight()/bounds.getHeight());
AffineTransform transforms[]=
{
AffineTransform.getScaleInstance(zoom, zoom),
AffineTransform.getTranslateInstance(-bounds.getX(),-bounds.getY()),
AffineTransform.getTranslateInstance(viewRect.getX(),viewRect.getY()),
AffineTransform.getScaleInstance(ratioW, ratioH)
};
AffineTransform tr=new AffineTransform();
for(int i=0;i< transforms.length;++i)
{
tr.concatenate(transforms[i]);
}
Shape shape2=tr.createTransformedShape(shape);
graphics2D.draw(shape2);
Run Code Online (Sandbox Code Playgroud)
关于正确的AffineTransform的任何想法?
非常感谢
皮埃尔
我是一个在Java Swing上旋转和平移形状的命令模式.平移和旋转分离得很好,但是当我做60度时.旋转然后平移,平移跟随新的旋转坐标.这意味着如果我拖动鼠标,形状移动与鼠标移动矢量60度的差距是否有任何简单的解决方案?请帮忙,我在这里碰墙
我的旋转执行方法
public void execute() {
System.out.println("command: rotate " + thetaDegrees );
Iterator iter = objects.iterator();
Shape shape;
while(iter.hasNext()){
shape = (Shape)iter.next();
mt.addMememto(shape);
AffineTransform t = shape.getAffineTransform();
t.rotate(Math.toRadians(thetaDegrees), shape.getCenter().x, shape.getCenter().y);
shape.setAffineTransform(t);
}
}
Run Code Online (Sandbox Code Playgroud)
我的翻译执行方法
public void execute() {
Iterator iter = objects.iterator();
Shape shape;
while(iter.hasNext()){
shape = (Shape)iter.next();
mt.addMememto(shape);
AffineTransform t = shape.getAffineTransform();
System.out.println("Translation x :"+x + ", Translation y :"+y);
t.translate(x,y);
shape.setAffineTransform(t);
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助都可以非常感激
我这里有一个尺寸为2156x1728的黑/白png文件,我希望使用AffineTransform旋转90度.生成的图像没有正确的比例.这里有一些示例代码(假设我已成功将png文件加载到BufferedImage中):
public BufferedImage transform(BufferedImage image){
System.out.println("Input width: "+ image.getWidth());
System.out.println("Input height: "+ image.getHeight());
AffineTransform affineTransform = new AffineTransform();
affineTransform.setToQuadrantRotation(1, image.getWidth() / 2, image.getHeight() / 2);
AffineTransformOp opRotated = new AffineTransformOp(affineTransform, AffineTransformOp.TYPE_BILINEAR);
BufferedImage transformedImage = opRotated.createCompatibleDestImage(image, image.getColorModel());
System.out.println("Resulting width: "+ transformedImage.getWidth());
System.out.println("Resulting height: "+ transformedImage.getHeight());
transformedImage = opRotated.filter(image, transformedImage);
return transformedImage;
}
Run Code Online (Sandbox Code Playgroud)
输出相应:
输入宽度:2156
输入高度:1728
结果宽度:1942年
结果身高:1942年
旋转如何回归这些完全不相关的尺寸?
我有以下代码,它可以完成我想要绘制一个上面有一些棋子的棋盘的(第一部分)。
Image pieceImage = getImage(currentPiece);
int pieceHeight = pieceImage.getHeight(null);
double scale = (double)side/(double)pieceHeight;
AffineTransform transform = new AffineTransform();
transform.setToTranslation(xPos, yPos);
transform.scale(scale, scale);
realGraphics.drawImage(pieceImage, transform, this);
Run Code Online (Sandbox Code Playgroud)
也就是说,它获取棋子的图像和图像的高度,将该图像的绘图转换为棋子所在的正方形,并将图像缩放到正方形的大小。
假设我想将黑色块旋转 180 度。我希望在某个地方有类似的东西:
transform.rotate(Math.toRadians(180) /* ?, ? */);
Run Code Online (Sandbox Code Playgroud)
但我不知道要输入什么作为 X 和 Y。如果我什么都不输入,图像会很好地围绕棋盘方格的 0,0 点旋转,将棋子倒置在方格的东北方。应该是这样。我猜测过 x,y 的各种其他组合,但还没有运气。
我已经在使用翻译将片段放在正确的正方形中,旋转变换需要另一个 x,y 来围绕它旋转事物,但我不知道如何告诉变换将片段围绕一个 x,y 旋转并写入图像到不同的 x,y。有人可以帮助我设置旋转参数,或者向我指出一些可以解释这些东西如何工作的东西吗?我发现了一些无法解释它们如何工作的例子,到目前为止我还没有弄清楚如何根据我的情况改变它们......
主要编辑:添加工作代码。抱歉,我不知道如何发布图片,请替换为您自己的图片。
当我运行以下命令时,我得到一个 2x2 的棋盘,左上角有一个车,右下角有一个马。
如果我进入 SmallChessboardComponent 并从第一个旋转变换语句中去掉注释分隔符,我会将车颠倒在原来的位置,并且马不会出现。如果我将注释分隔符从第二个转换语句中删除,则任何一个片段都不会出现。
我正在寻找一种方法,将这些碎片翻转到它们无论如何都会出现的正方形上。我想把每一块都画到板上;我不想要翻转棋盘的代码。
主要程序:
package main;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import directredraw.SmallChessboardComponent;
public class SmallChessboardMain
{
private static void dbg (String message) { System.out.println(message); } …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Kloss和Kloss在“使用NumPy进行N维线性向量场回归”(2010,Python论文源代码2)中给出的解决方案,给出给定两点的二维仿射变换。
他们提供了一种方法来查找连接两组点y和x的仿射变换, 其中该变换由矩阵A和向量b表示(即矩阵方程y = Ax + b)。
在二维中,您有6个未知数,其中四个定义2x2 A矩阵,另外2个定义b。
但是,在示例脚本和描述它的论文中,它们具有未知数t = n ^ 2 + n,其中n是点的数量,这意味着您需要六个点,对于2D情况,它实际上是12个已知值(即x和图像上每个点的y值)。
他们通过以下方式对此进行了测试:
def solve(point_list):
"""
This function solves the linear equation system involved in the n
dimensional linear extrapolation of a vector field to an arbitrary point.
f(x) = x * A + b
with:
A - The "slope" of the affine function in an n …Run Code Online (Sandbox Code Playgroud) 调整大小和翻转函数应该在左侧面板中生成结果图像.但是,调整大小功能只生成相同的图像,翻转功能会产生黑屏图像.我该如何解决?
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ImgViewTester extends JFrame implements ActionListener
{
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem openItem = new JMenuItem("Open Image...");
JLabel imgLabel = new JLabel();
JLabel newImgLabel …Run Code Online (Sandbox Code Playgroud) 据我所知,OpenCV使用RANSAC来解决的问题,findhomograph并且它返回一些有用的参数,例如homograph_mask。但是,如果我只想估计表示仿射矩阵的2D变换,是否可以使用findHomography使用RANSAC 的相同方法并返回该掩码的方法?
我想知道在使用面板的paintComponent进行缩放后,检索鼠标位置的最佳方法是什么?(相对于此缩放的位置).
这是缩放代码:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if(zoomer==true){
at.scale(zoom,zoom);//at = AffineTransform...
zoomer=false;
}
g2.transform(at);
Run Code Online (Sandbox Code Playgroud)
在我的主类中,我使用鼠标侦听器私有类并覆盖mouseRelase方法:
@Override
public void mouseReleased(MouseEvent e)
e.getX();//Location of the mouse on the X axis
Run Code Online (Sandbox Code Playgroud)
我正在绘制不同的形状,如点.每个点都有它的像素位置存储,所以如果在X:20和Y:30创建它,这永远不会改变.当我调用paintComponent时,它会被放大或缩小.我的问题是,我可以在面板上找到这些点的位置,它在一些textFields中给出了一些关于我点击的点的信息.如果面板已放大/缩小,则clic的位置仍然相同,所以假设我放大,形状不会在x:20和y:30,而是在基于比例的随机位置.我怎样才能将我的clic位置调整到这个比例?
不确定我是否明确了myselft,所以如果您需要更多信息,请不要犹豫.
谢谢
我正在使用 c++ 中的 opencv 开发车道检测算法。我进行了仿射变换以将三角形区域提取到蒙版中。
在此步骤之后,我想执行 Canny 边缘检测器。但它不起作用。是因为位转换吗?或者我的问题是什么?
我将主要部分外包给函数 warpTriangle。程序最后在此函数中中断。
错误信息:
OpenCV Error: Assertion failed ((_dst.getObj() != _src.getObj() || _src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3))) && "Inplace parameters are not supported") in Canny, file /tmp/opencv-20180113-80339-d8g5mw/opencv-3.4.0/modules/imgproc/src/canny.cpp, line 935
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /tmp/opencv-20180113-80339-d8g5mw/opencv-3.4.0/modules/imgproc/src/canny.cpp:935: error: (-215) (_dst.getObj() != _src.getObj() || _src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3))) && "Inplace parameters are not supported" in function …
我的问题与我问的另一个问题有关。但在这里我试图更准确地理解使用 cv2.getAffineTransform 获得的 warp_matrix 的组成。我在这找到了如何分解仿射变换矩阵,尤其是如何获得旋转角度
但是当使用OpenCV Doc 中的示例时,我获得了两个不同的旋转角度。
编码 :
import cv2
import numpy as np
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
theta0=np.degrees(np.arctan(-M[0,1]/M[0,0]))
theta1=np.degrees(np.arctan(M[1,0]/M[1,1]))
print(theta0)
print(theta1)
Run Code Online (Sandbox Code Playgroud)
生产 :
-25.3461759419
-18.4349488229
Run Code Online (Sandbox Code Playgroud)