标签: affinetransform

使用AffineTransform将Shape缩放/转换为给定的Rectangle

我正在尝试扩展/翻译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 graphics drawing shapes affinetransform

3
推荐指数
1
解决办法
1万
查看次数

如何使用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)

任何帮助都可以非常感激

java translation 2d rotation affinetransform

2
推荐指数
1
解决办法
9883
查看次数

AffineTransform会截断图片,我有什么不对?

我这里有一个尺寸为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年

旋转如何回归这些完全不相关的尺寸?

java awt affinetransform

2
推荐指数
2
解决办法
3710
查看次数

AffineTransform.rotate() - 如何同时缩放、旋转和缩放?

我有以下代码,它可以完成我想要绘制一个上面有一些棋子的棋盘的(第一部分)。

              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)

java graphics awt image-rotation affinetransform

2
推荐指数
1
解决办法
1万
查看次数

仿射变换检索中的最小点数?

我正在尝试使用Kloss和Kloss在“使用NumPy进行N维线性向量场回归”(2010,Python论文源代码2)中给出的解决方案,给出给定两点的二维仿射变换

文章源代码

他们提供了一种方法来查找连接两组点yx的仿射变换, 其中该变换由矩阵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)

numpy image-processing linear-algebra affinetransform

2
推荐指数
1
解决办法
6277
查看次数

为什么图像重新调整大小和翻转功能不起作用?

调整大小和翻转函数应该在左侧面板中生成结果图像.但是,调整大小功能只生成相同的图像,翻转功能会产生黑屏图像.我该如何解决?

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)

java swing bufferedimage affinetransform javax.imageio

2
推荐指数
1
解决办法
118
查看次数

使用Ransac估计两组点之间的2D变换

据我所知,OpenCV使用RANSAC来解决的问题,findhomograph并且它返回一些有用的参数,例如homograph_mask。但是,如果我只想估计表示仿射矩阵的2D变换,是否可以使用findHomography使用RANSAC 的相同方法并返回该掩码的方法?

c++ opencv homography affinetransform ransac

2
推荐指数
2
解决办法
3975
查看次数

放大和缩小jPanel

我想知道在使用面板的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,所以如果您需要更多信息,请不要犹豫.

谢谢

java zoom jpanel affinetransform paintcomponent

2
推荐指数
1
解决办法
3633
查看次数

ConvexPoly 不起作用后 OpenCV Canny

我正在使用 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 …

c++ opencv affinetransform

2
推荐指数
1
解决办法
1586
查看次数

仿射 warp_matrix 内部是什么(如何分解)

我的问题与我的另一个问题有关。但在这里我试图更准确地理解使用 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)

python opencv affinetransform cv2

2
推荐指数
1
解决办法
1603
查看次数