我们知道有一个RadialGradientPaint
用Java 命名的类,我们可以使用它来绘制圆形渐变画.
但我想要一个椭圆形(椭圆形)GradientPaint
.如何实现椭圆形GradientPaint
?
我试图通过匹配SIFT描述符并通过RANSAC查找转换矩阵来搜索输入图像中的特定对象.该对象只能通过2D空间中的相似变换(缩放,旋转,平移)在场景中进行修改,因此我需要在3D空间中估计2x2变换矩阵而不是3x3单应矩阵.我怎样才能在OpenCV中实现这一目标?
opencv image-processing computer-vision homography affinetransform
你好我是affineTransform
java 新手.我想用它来剪切一些我以后要使用的GUI.现在我只想测试一个示例代码,但我无法解释它的输出.这是代码
package main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainClass{
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
jf.getContentPane().add(new MyCanvas());
jf.setSize(600, 600);
jf.setVisible(true);
}
}
class Left extends JPanel {
Left(){
setPreferredSize(new Dimension(450,450));
setBorder(BorderFactory.createLineBorder(Color.green));
setBackground(Color.gray);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
AffineTransform at = new AffineTransform();
g2.setTransform(at);
g2.drawRect(getWidth()/2 - 10, getHeight()/2 - 10, 20, …
Run Code Online (Sandbox Code Playgroud) 我的应用程序布局类似于:自定义JFrame(仅处理gui的创建),其中包含一个标准JPanel,其中包含一个自定义JPanel
在自定义的JPanel(称为MinimapPanel)内部,我更改了paint方法:
//in a constructor:
scaledTransform = new AffineTransform(); = new AffineTransform();
scaledTransform = new AffineTransform();
scaledTransform.scale(scaleAmount, scaleAmount);
//...
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setTransform(scaledTransform);
mapDrawer.paintMinimap(g, seatMap, miniViewHandler);//it just calls a bunch of fillRect
if (viewRect != null) {
g.setColor(new Color(255, 0, 0));
int x = viewRect.x;
int y = viewRect.y;
g.drawRect(x, y, Math.abs(viewRect.width), Math.abs(viewRect.height));
}
g2d.setTransform(plainTransform);
}
Run Code Online (Sandbox Code Playgroud)
如果我不应用trasform,或者缩放比例为1.0(无),则一切正常,但如果缩放,则每次JFrame重新绘制时,MinimapPanel都保持空白。
关于我可能做错了什么的任何想法?
我有一个500宽度和400高度的屏幕,我有一个带有一堆形状的矢量.假设矢量有两种不同的形状,例如.我希望从屏幕底部随机弹出的对象达到一定的上升然后再下降(类似于游戏水果忍者,其中水果是我的形状).
在我的主(视图)中,我有一个形状向量,我实例化定时器,添加到数组并使用translate函数将它们放在屏幕的底部.我的计时器接受一个动作监听器,它基本上改变了形状的转换,直到上升然后向下移动,但我的问题是所有的形状都是在同一时间开始的.
像这样的东西:
Shape f = new Shape(new Area(new Ellipse2D.Double(0, 50, 50, 50)));
f.translate(0, 400);
f.timer = new Timer( 10 , taskPerformer);
f.timer.start();
vector.add(f);
Shape f2 = new Shape(new Area(new Rectangle2D.Double(0, 50, 50, 50)));
f2.translate(200, 400);
f2.timer = new Timer( 10 , taskPerformer);
f2.timer.setInitialDelay(5000);
f2.timer.start();
vector.add(f2);
Run Code Online (Sandbox Code Playgroud)
和我的动作听众:
Random generator = new Random();
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
for (Shape s : model.getShapes()) {
// Scale object using translate
// once reached …
Run Code Online (Sandbox Code Playgroud) 旋转后,图像上的点(x,y)需要位于同一图像上.我使用了imrotate,imtransform和imwarp来旋转图像(下面的代码显示了imwarp的实现),但似乎没有一个对我有用.输出旋转图像大于原始图像.任何人都可以建议如何在输出旋转图像上找到相同的点.
close all;
I=imread('P.png');
x=339;
y=317;
subplot(2,2,1);
imshow(I),title('Original Image');
hold on;
plot(x,y,'ro');
hold off;
theta=5;
tform = affine2d([cosd(theta) -sind(theta) 0;sind(theta) cosd(theta) 0; 0 0 1])
RI = imwarp(I,tform);
[x1,y1]=transformPointsForward(tform,x,y);
subplot(2,2,2);
imshow(RI),title('Rotated Image');
hold on;
plot(x1,y1,'ro');
hold off;
Run Code Online (Sandbox Code Playgroud)
虽然旋转图像与原始图像具有相同的大小,但代码仍然有效.但在我的情况下,它会导致裁剪原始图像.我已经能够在各种论坛上找到这个问题的答案,但似乎没有一个对我有用.请回答.
这段代码:
from scipy.ndimage.interpolation import affine_transform
import numpy as np
...
nzoom = 1.2
newimage = affine_transform(self.image, matrix=np.array([[nzoom, 0],[0, nzoom]]))
Run Code Online (Sandbox Code Playgroud)
失败:
RuntimeError: affine matrix has wrong number of rows
Run Code Online (Sandbox Code Playgroud)
矩阵有什么问题?我也试过matrix=[nzoom, nzoom]
,根据我对文档的阅读应该做同样的事情,但它以同样的方式失败。
有什么方法可以使用 OpenCV 和 Python 来拉直这个图像吗?我正在使用不同的转换来解决它,但我无法得到它。
这是我的代码:
rows, cols, h = img.shape
M = np.float32([[1, 0, 100], [0, 1, 50]])
Run Code Online (Sandbox Code Playgroud)
然后我应用仿射变换。
dst = cv2.warpAffine(roi, M, (cols, rows))
Run Code Online (Sandbox Code Playgroud)
我仍然无法获得所需的图像输出来拉直。现在挠我的头快一个小时了。任何人都可以帮助我吗?
opencv image-processing image-rotation affinetransform python-2.7
假设我有一个2x2矩阵,其中填充了代表平面的值.现在我想在"z方向"中以三维方式围绕自身旋转平面.为了更好地理解,请参见下图:
我想知道这是否可以通过一个简单的仿射矩阵,因此我创建了以下简单的脚本:
%Create a random value matrix
A = rand*ones(200,200);
%Make a box in the image
A(50:200-50,50:200-50) = 1;
Run Code Online (Sandbox Code Playgroud)
现在我可以通过这样的旋转矩阵在二维房间中应用变换:
R = affine2d([1 0 0; .5 1 0; 0 0 1])
tform = affine3d(R);
transformed = imwarp(A,tform);
Run Code Online (Sandbox Code Playgroud)
但是,这不会产生上面所需的输出,我不太确定如何创建2-D仿射矩阵来创建这样的行为.
我猜三维仿射矩阵可以做到这一点.但是,如果我定义一个3-D仿射矩阵,我就不能再使用矩阵的二维表示,因为MATLAB会抛出错误:
The number of dimensions of the input image A must be 3 when the
specified geometric transformation is 3-D.
Run Code Online (Sandbox Code Playgroud)
那么如何用仿射矩阵编码所需的输出呢?
我正在尝试从单个组件(如平移、旋转、缩放、剪切)创建一个 2D 透视变换矩阵。但最终矩阵并没有产生如下图所示的真实透视效果。我想我在为创建矩阵而编写的代码中缺少一些组件。有人可以帮我在下面的函数中添加缺少的组件及其公式吗?我的代码使用了 opencv 库
cv::Mat getPerspMatrix2D( double rz, double s, double tx, double ty ,double shx, double shy)
{
cv::Mat R = (cv::Mat_<double>(3,3) <<
cos(rz), -sin(rz), 0,
sin(rz), cos(rz), 0,
0, 0, 1);
cv::Mat S = (cv::Mat_<double>(3,3) <<
s, 0, 0,
0, s, 0,
0, 0, 1);
cv::Mat Sh = (cv::Mat_<double>(3,3) <<
1, shx, 0,
shy, 1, 0,
0, 0, 1);
cv::Mat T = (cv::Mat_<double>(3,3) <<
1, 0, tx,
0, 1, ty,
0, 0, 1);
return T * Sh …
Run Code Online (Sandbox Code Playgroud) affinetransform ×10
java ×4
opencv ×3
swing ×3
matlab ×2
animation ×1
awt ×1
graphics2d ×1
homography ×1
image ×1
java-2d ×1
matrix ×1
paint ×1
perspective ×1
python ×1
python-2.7 ×1
rotation ×1
scaling ×1
scipy ×1
timer ×1