这个问题是关于OpenCV的功能findHomography
,getPerspectiveTransform
&getAffineTransform
有什么区别findHomography
和getPerspectiveTransform
?我从文档中理解的是,getPerspectiveTransform
使用4个对应关系(这是计算单应性/透视变换所需的最小值)findHomography
计算变换,即使你提供4个以上的对应关系(大概使用像最小二乘法这样的东西),计算变换也是如此? ).它是否正确?(在这种情况下,OpenCV仍然继续支持getPerspectiveTransform的唯一原因应该是遗留?)
我的下一个问题是,我想知道是否有相当于findHomography
计算仿射变换的东西?即使用最小二乘法或等效鲁棒方法计算和仿射变换的函数.根据文档getAffineTransform
只需3个对应关系(这是计算仿射变换所需的最小值).
最好,
我一直在为另一个问题找到答案,并遇到了一个我以前从未见过的奇怪问题......
基本上,程序使用a AffineTransform
来提供Graphics
元素的翻译,缩放和旋转,简单的东西,之前完成了一千次
问题是,当屏幕第一次出现时,输出不是它应该的位置,但是一旦我触摸其中一个控件(调整其中一个幻灯片),它就会跳到正确的位置.
根据屏幕截图,Graphics
内容似乎被其他控件的数量错位.
如果我从GUI中删除控件,它将出现在正确的位置(位于中心).如果我调整窗口的大小,它并没有解决这个问题,它只有当滑块之一触发修复repaint
的DrawPane
...
我已经在输出中添加了诊断信息,并且所有值都相同 - 也就是说,它们在程序首次启动时以及将所有滑块值调整为初始值时打印相同的值.
如果我从中删除setRotation
和setScale
调用AffineTransform
,它不会修复它.如果我删除了setTranslation
,则在面板更新之前,方块最初不会被绘制(它在屏幕外绘制)
如果我使用Graphics2D g2d = (Graphics)g;
而不是g.create()
相同的结果(是的,我在paintComponent
退出方法之前重置转换;))
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Parker {
public static void …
Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试创建仿射变换,这将允许我将三角形转换为另一个.我所拥有的是2个三角形的坐标.你能帮助我吗?
按照亚当罗森菲尔德的回答,我想出了这个代码,万一有人无聊自己解决方程:
public static AffineTransform createTransform(ThreePointSystem source,
ThreePointSystem dest) {
double x11 = source.point1.getX();
double x12 = source.point1.getY();
double x21 = source.point2.getX();
double x22 = source.point2.getY();
double x31 = source.point3.getX();
double x32 = source.point3.getY();
double y11 = dest.point1.getX();
double y12 = dest.point1.getY();
double y21 = dest.point2.getX();
double y22 = dest.point2.getY();
double y31 = dest.point3.getX();
double y32 = dest.point3.getY();
double a1 = ((y11-y21)*(x12-x32)-(y11-y31)*(x12-x22))/
((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
double a2 = ((y11-y21)*(x11-x31)-(y11-y31)*(x11-x21))/
((x12-x22)*(x11-x31)-(x12-x32)*(x11-x21));
double a3 = y11-a1*x11-a2*x12;
double a4 = ((y12-y22)*(x12-x32)-(y12-y32)*(x12-x22))/
((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
double a5 = …
Run Code Online (Sandbox Code Playgroud) 当使用scale()
具有两个不同参数的Graphics2D 函数(在x和y方向上按不同比例缩放)时,稍后在此Graphics2D对象上绘制的所有内容也会缩放.这具有奇怪的效果,即在一个方向上绘制的线比在另一个方向上绘制的线更粗.以下程序产生此效果,它显示以下窗口:
public class StrokeExample extends JPanel {
public void paintComponent(Graphics context) {
super.paintComponent(context);
Graphics2D g = (Graphics2D)context.create();
g.setStroke(new BasicStroke(0.2f));
int height = getHeight();
int width = getWidth();
g.scale(width/7.0, height/4.0);
g.setColor(Color.BLACK);
g.draw(new Rectangle( 2, 1, 4, 2));
}
public static void main(String[] params) {
EventQueue.invokeLater(new Runnable(){public void run() {
StrokeExample example = new StrokeExample();
JFrame f = new JFrame("StrokeExample");
f.setSize(100, 300);
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(example);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setVisible(true);
}});
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此坐标转换以避免必须手动将我的应用程序模型坐标(在此示例中为(2,1,2,4))转换为屏幕(或组件)像素坐标,但我不希望此笔画失真.换句话说,我希望所有线都具有相同的宽度,与当前的x和y尺度因子无关.
我知道是什么产生了这种效果(Stroke对象创建了一个在用户坐标中绘制的矩形的描边形状,然后被转换为屏幕坐标),但我不确定如何解决这个问题.
我在iPhone上使用OpenCV 2.2来检测面部.我正在使用IOS 4的AVCaptureSession来访问摄像机流,如下面的代码所示.
我的挑战是视频帧以CVBufferRef(指向CVImageBuffer)对象的形式出现,它们以480px宽,300px高的方式呈现为风景.如果您将手机侧向握住,这很好,但是当手机处于直立位置时,我想将这些框架顺时针旋转90度,以便OpenCV可以正确找到面部.
我可以将CVBufferRef转换为CGImage,然后转换为UIImage,然后旋转,就像这个人正在做的那样:旋转从视频帧中获取的CGImage
然而,这浪费了很多CPU.我正在寻找一种更快速旋转图像的方法,如果可能的话,理想情况下使用GPU进行处理.
有任何想法吗?
伊恩
代码示例:
-(void) startCameraCapture {
// Start up the face detector
faceDetector = [[FaceDetector alloc] initWithCascade:@"haarcascade_frontalface_alt2" withFileExtension:@"xml"];
// Create the AVCapture Session
session = [[AVCaptureSession alloc] init];
// create a preview layer to show the output from the camera
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
previewLayer.frame = previewView.frame;
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[previewView.layer addSublayer:previewLayer];
// Get the default camera device
AVCaptureDevice* camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// Create a AVCaptureInput with the camera …
Run Code Online (Sandbox Code Playgroud) 我已经阅读了以下内容,从一步仿射变换绕一点旋转?:
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, a);
transform = CGAffineTransformTranslate(transform,-x,-y);
Run Code Online (Sandbox Code Playgroud)
然而,当我这样做时,转换的图像遍布地图,很少在屏幕上.
我已经尝试了一个系统,它将放置图像; 如果运行循环并放置多个值,则会出现螺旋线.然而,虽然我可能最终能够解开图像旋转和我希望它们旋转的点之间的关系,但我想要求"我在这里有一个图像的最佳解决方案;我认为这一点是它的中心;我希望它围绕它的中心旋转这个数量,但不会因此而移位."
我正在尝试修改http://jonathansCorner.com/ancient-clock/的端口,现在我正在尝试放置时针.所有尝试在上面进行歌曲和舞蹈,并将其翻译成其中心位于所需中心的尝试都失败了.
对于这个时钟的手,我怎么能说"我想让手在下面的旋转中"并将它们放在中心周围?
- 编辑 -
编写此代码的关键部分是尝试使用图层来响应评论,其中包括:
UIImage *hourHandImage = [UIImage imageNamed:@"hour-hand.png"];
UIImageView *hourHandView = [[UIImageView alloc] initWithImage:hourHandImage];
float hourRotation = .5;
hourHandImage = [UIImage imageNamed:@"hour-hand.png"];
hourHandView = [[UIImageView alloc] initWithImage:hourHandImage];
CGAffineTransform transform = CGAffineTransformMakeTranslation(centerX - 21, -centerY - 121);
// transform = CGAffineTransformRotate(transform, hourRotation);
// transform = CGAffineTransformTranslate(transform, 2 * centerX, 2 * centerY);
hourHandView.transform = transform;
hourHandView.layer.anchorPoint = CGPointMake(centerX, …
Run Code Online (Sandbox Code Playgroud) 嗨,我是计算机视觉的初学者,我想知道单应性和仿射变换之间究竟有什么区别,如果你想找到两个图像之间的平移,你会使用哪个,为什么?从我在网上找到的论文和定义来看,我还没有找到它们之间的区别,而是使用了一个而不是另一个.
谢谢你的帮助.
opencv terminology computer-vision homography affinetransform
使用AffineTransform类在Java中旋转图像时遇到一些问题.
我有以下方法来创建图像的旋转(90度)副本:
private BufferedImage createRotatedCopy(BufferedImage img, Rotation rotation) {
int w = img.getWidth();
int h = img.getHeight();
BufferedImage rot = new BufferedImage(h, w, BufferedImage.TYPE_INT_RGB);
double theta;
switch (rotation) {
case CLOCKWISE:
theta = Math.PI / 2;
break;
case COUNTERCLOCKWISE:
theta = -Math.PI / 2;
break;
default:
throw new AssertionError();
}
AffineTransform xform = AffineTransform.getRotateInstance(theta, w / 2, h / 2);
Graphics2D g = (Graphics2D) rot.createGraphics();
g.drawImage(img, xform, null);
g.dispose();
return rot;
}
Run Code Online (Sandbox Code Playgroud)
旋转是一个简单的枚举,值为NONE,CLOCKWISE和COUNTERCLOCKWISE.
我的问题的症状显示在这里:
http://perp.se/so/rotate_problems.html
因此,旋转工作正常,但生成的图像不会锚定到正确的坐标(或应该如何放置).因为我真的不知道我在做什么(我的线性代数很弱),我不知道如何自己解决这个问题.
我尝试了一些随机摆弄AffineTransform实例,但它没有帮助我(当然).我试过谷歌搜索(并搜索SO),但我见过的所有例子基本上都使用与我相同的方法...这对我不起作用.
感谢您的建议.
我对16位数据使用双线性插值有问题.我有两个图像,origImage和displayImage.我想使用AffineTransformOp通过AffineTransform将origImage过滤到displayImage,这是显示区域的大小.origImage的类型为BufferedImage.TYPE_USHORT_GRAY,并且具有sun.awt.image.ShortInterleavedRaster类型的栅格.这是我现在的代码
displayImage = new BufferedImage(getWidth(), getHeight(), origImage.getType());
try {
op = new AffineTransformOp(atx, AffineTransformOp.TYPE_BILINEAR);
op.filter(origImage, displayImage);
}
catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
为了显示错误,我创建了2个渐变图像.一个具有15位范围内的值(最大值为32767),另一个值位于16位范围内(最大值为65535).以下是两张图片
15位图像
16位图像
这两个图像是以相同的方式创建的,看起来应该相同,但请注意16位图像中间的线条.起初我认为这是一个溢出问题,然而,奇怪的是它在梯度的中心而不是在像素值更高的末端表现出来.此外,如果它是溢出问题,我怀疑15位图像也会受到影响.
任何有关这方面的帮助将不胜感激.
我只是想知道为什么没有人回答,我提供了足够的信息吗?需要更多信息吗?
下面是我用来生成AffineTransform的代码.所有引用的变量都是根据用户输入(鼠标移动)计算出来的,并且应该是正确的(它已被包括我自己在内的很多人测试过).希望这可以帮助解决错误.
AffineTransform panTranslate = new AffineTransform();
panTranslate.translate(imagePanOffset.x, imagePanOffset.y);
AffineTransform rotateCenterTranslate = new AffineTransform();
rotateCenterTranslate.translate(imageRotateCTR.x, imageRotateCTR.y);
AffineTransform rotateTransform = new AffineTransform();
rotateTransform.rotate(Math.toRadians(rotateValue));
AffineTransform rotateAntiCenterTranslate = new AffineTransform();
rotateAntiCenterTranslate.translate(-imageRotateCTR.x, -imageRotateCTR.y);
AffineTransform translateTransform = new AffineTransform();
translateTransform.translate(imageMagOffset.x, imageMagOffset.y);
AffineTransform flipMatrixTransform = new AffineTransform();
switch (flipState) {
case ENV.FLIP_NORMAL: // NORMAL
break;
case ENV.FLIP_TOP_BOTTOM: // …
Run Code Online (Sandbox Code Playgroud) 我有与此处描述的相同的问题: 如何使用python执行坐标仿射变换?
我试图使用描述的方法,但有些原因我会收到错误消息.我对代码所做的更改是替换主系统和辅助系统点.我通过使用不同的origo创建了辅助坐标点.在我正在研究的实际情况中,这个主题在测量坐标时会有一些错误.
Run Code Online (Sandbox Code Playgroud)primary_system1 = (40.0, 1160.0, 0.0) primary_system2 = (40.0, 40.0, 0.0) primary_system3 = (260.0, 40.0, 0.0) primary_system4 = (260.0, 1160.0, 0.0) secondary_system1 = (610.0, 560.0, 0.0) secondary_system2 = (610.0,-560.0, 0.0) secondary_system3 = (390.0, -560.0, 0.0) secondary_system4 = (390.0, 560.0, 0.0)
我在执行时遇到的错误.
*Traceback (most recent call last):
File "affine_try.py", line 57, in <module>
secondary_system3, secondary_system4 )
File "affine_try.py", line 22, in solve_affine
A2 = y * x.I
File "/usr/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.py", line 850, in getI
return asmatrix(func(self))
File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 445, …
Run Code Online (Sandbox Code Playgroud) affinetransform ×10
java ×5
opencv ×3
homography ×2
ios ×2
16-bit ×1
3d ×1
awt ×1
c++ ×1
image ×1
java-2d ×1
math ×1
numpy ×1
objective-c ×1
rotation ×1
stroke ×1
swing ×1
terminology ×1