小编Swa*_*oth的帖子

VTK更新多个渲染窗口的位置

尝试在我写的Python VTK应用程序中运行多个渲染窗口时,我遇到了一些问题.该应用程序尝试在立体应用程序的两个单独视图中呈现3D模型(即左渲染和右渲染),但我遇到同时更新每个窗口的摄像机的问题.我现在有设置了两个几乎相同的管道,每个都有自己的vtkCamera,vtkRenderWindow,vtkRenderer,和vtkRenderWindowInteractor,在于右照相机在位置上的唯一区别移位30个单元沿X轴.

每个渲染窗口交互器都通过vtkRenderWindowInteractor.AddObserver()调用简单函数的方法进行更新,以将摄像机重置为其原始位置和方向.最大的问题是,这似乎只出现在一个窗口上,特别是当时关注的窗口.就好像交互器的计时器在交互器失去焦点时关闭一样.此外,当我按住鼠标(并因此移动相机)时,渲染的图像开始"漂移",重置为越来越不正确的位置,即使我已将坐标硬编码到函数中.

显然我对VTK很新,而且很多事情都是相当令人困惑的,因为后端隐藏了很多东西,所以在这个问题上获得一些帮助会很神奇.我的代码如下.多谢你们!

from vtk import*
from parse import *
import os
import time, signal, threading

def ParseSIG(signum, stack):
        print signum
        return

class vtkGyroCallback():
        def __init__(self):
                pass
        def execute(self, obj, event):
                #Modified segment to accept input for leftCam position 
                gyro = (raw_input())
                xyz = parse("{} {} {}", gyro)
                #This still prints every 100ms, but camera doesn't update!
                print xyz

                #These arguments are updated and the call is made.
                self.leftCam.SetPosition(float(xyz[0]), …
Run Code Online (Sandbox Code Playgroud)

python render stereo-3d vtk

7
推荐指数
1
解决办法
3328
查看次数

使用cv :: SolvePnP进行外部校准

我目前正在尝试使用外部跟踪系统实现基于网络摄像头的AR的替代方法.除了外部校准外,我在环境中配置了所有内容.我决定使用,cv::solvePnP()因为它应该做的几乎我想要的,但两个星期后我拉我的头发试图让它工作.下图显示了我的配置.c1是我的相机,c2是我正在使用的光学跟踪器,M是连接到相机的跟踪标记,ch是棋盘格.

我的配置图

就目前而言,我传递了我的图像像素坐标cv::findChessboardCorners().参考附加到相机c1的跟踪标记M获取世界点(外部因此是从该标记的帧到相机原点的变换).我用最多50个点的数据集测试了它,以减轻局部最小值的可能性,但是现在我只测试了四个2D/3D点对.从rvec和tvec返回的结果cv::solvePnP()是从平移和旋转方面得到的大量关闭相对于我手动创建的基本真实外观和基本视觉分析(翻译意味着1100mm距离,而相机是最多10毫米).

最初我认为问题在于我对我的董事会姿势如何确定有一些含糊之处,但现在我很确定情况并非如此.数学看起来非常简单,在我完成设置系统的所有工作之后,陷入基本上是单行的是一个巨大的挫败感.老实说,我没有选择权,所以如果有人可以提供帮助,我将非常欠你的债务.我的测试代码发布在下面,与我的实现相同,减去一些渲染调用.与我的程序一起工作的基本真理外部实例如下(基本上是围绕一个轴的纯旋转和小的平移):

1     0     0     29
0   .77  -.64   32.06
0   .64   .77  -39.86
0     0     0     1
Run Code Online (Sandbox Code Playgroud)

谢谢!

#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>

int main()
{
    int imageSize     = 4;
    int markupsSize   = 4;
    std::vector<cv::Point2d> imagePoints;
    std::vector<cv::Point3d> markupsPoints;
    double tempImage[3], tempMarkups[3]; // Temp variables or iterative data construction  

    cv::Mat CamMat = (cv::Mat_<double>(3,3) <<  (566.07469648019332), 0, 318.20416967732666, 
        0,  (565.68051204299513), -254.95231997403764, 0,  0, 1);  

    cv::Mat DistMat = (cv::Mat_<double>(5,1) <<  -1.1310542849120900e-001, 4.5797249991542077e-001,
    7.8356355644908070e-003, 3.7617039978623504e-003, -1.2734302146228518e+000);

    cv::Mat …
Run Code Online (Sandbox Code Playgroud)

camera opencv transformation augmented-reality camera-calibration

6
推荐指数
1
解决办法
2181
查看次数

AR与外部跟踪 - 对齐错误,值是正确的

我最近成功地使我的增强现实应用程序启动并运行接近预期.但是,我遇到了一个问题,即使值是正确的,增量仍然是一些翻译!因为我这将是美妙的得到这个解决如此接近到有这件事.

该系统利用具有红外反射标记的外部跟踪系统(Polaris Spectra立体光学跟踪器)来建立全局和参考帧.我有一个带有标记的LEGO结构,它是增强的目标,使用CAD创建的LEGO结构的3D模型,具有其真实世界对应物的精确规格,跟踪指针工具和带有世界参考的相机标记附在它上面.使用3D Slicer中的工具集将虚拟空间注册到现实世界中,这是一个医学成像软件,这是我正在开发的环境.下面是几张照片,只是为了澄清我正在处理的系统(May或可能与该问题无关).

乐高结构,带有跟踪摄像头和世界参考标记

场景图像1,右上方有跟踪器,左侧是注册棋盘

因此,简要概述每个标记/组件的确切作用(标记是黑色十字架与四个银球):

  • 世界标记(右侧第1个图像)是所有其他标记变换的参考框架.它固定在LEGO模型上,因此可以对LEGO的虚拟等效物进行单次注册.
  • 相机标记(第1张图像,附在相机上)跟踪相机.通过使用执行的外部校准将相机注册到该标记cv::solvePnP().
  • 棋盘用于使用跟踪指针(未示出)获取用于外部校准的数据cv::findChessboardCorners().

到目前为止,我一直在粉碎我的脸,反对系统背后的数学,直到最终排成一行.当我在估计相机原点到参考原点的位置移动时,两者之间的平移向量约为[0; 0; 0].因此,所有注册似乎都能正常工作.但是,当我运行我的应用程序时,我得到以下结果:

偏移示例1

偏移示例2

如您所见,增强中存在奇怪的偏移.我已经尝试去除图像上的失真校正(目前已完成cv::undistort()),但这只会使问题变得更糟.旋转都是正确的,正如我之前所说,翻译似乎都很好.我不知道是什么导致了这一点.当然,在渲染管道的实现过程中会出现很多问题,所以我主要是在这里发布这个,希望有人遇到过类似的问题.我已经使用基于网络摄像头的跟踪方法执行了这个项目,即使我使用了相同的渲染过程也没有遇到过这样的问题.

在这篇文章中,我故意有点模棱两可,以避免因为情况的细节而使读者陷入困境,因为我可以包含许多不同的细节.如果需要更多信息,我可以提供.任何建议或见解都会受到大力赞赏.谢谢!

opencv transformation transform augmented-reality vtk

6
推荐指数
1
解决办法
392
查看次数

QEMU MIPS32 - 定制板上的 16550 Uart 实现

我正在尝试使用 QEMU 来模拟一段固件,但我无法让 UART 设备正确更新线路状态寄存器并显示输入字符。

细节:

目标设备:Qualcomm QCA9533(如果您好奇,请在此处查看文档

目标固件:VxWorks 6.6 with U-Boot bootload

CPU:MIPS 24Kc

板:mipssim(修改)

内存:512MB

使用的命令: qemu-system-mips -S -s -cpu 24Kc -M mipssim –nographic -device loader,addr=0xBF000000,cpu-num=0 -serial /dev/ttyS0 -bios target_image.bin

我必须在这里道歉,但我无法分享我的来源。但是,当我尝试重新调整 mipssim 板时,我只对代码进行了微小的更改,如下所示:

  • bios内存区域重新设置为 0x1F000000

  • 将 load_image_targphys ()目标地址更改为 0x1F000000

  • 将 $pc 初始值更改为 0xBF000000(TLB 重映射 0x1F000000)

  • mipssim serial_init() ¬call 替换为serial_mm_init(isa, 0x20000, env->irq[0], 115200, serial_hd(0), DEVICE_NATIVE_ENDIAN)

虽然看起来serial_init()可能是当前接受的标准,但我没有重新映射它的运气。我注意到马耳他板在我给它的 MIPS 测试内核上输出没有问题,所以我试图模仿那里做了什么。但是,我仍然无法理解 QEMU 是如何工作的,而且我无法找到许多解释它的好资源。我对源代码和包含的文档的搜索正在进行中,但与此同时,我希望有人可能对我做错了什么有一些了解。

二进制文件从地址 0xBF000000 加载并正确执行,但在遇到第一个 UART 轮询循环时挂起。在 QEMU 监视器中查看mtree显示 …

qemu mips emulation uart qualcomm

6
推荐指数
1
解决办法
470
查看次数

C链表中的内存泄漏

我一直在为学校做一个项目(今晚到期!),我有一些严重的记忆问题.我对C很新,当涉及到mallocing指针等等时,我仍然被抛出一个循环,所以我真的可以使用一些帮助.

代码如下.文件的顺序是LinkedLists.h(LinkedList模块的Header),LinkedLists.c(LinkedList模块)和TestList.c(主模块).

/******************************************************************************
* Base struct to contain data structure element information: deterimined by
* the application needs.
******************************************************************************/
#ifndef _LINKED_LISTS_H_
#define _LINKED_LISTS_H_

typedef struct ElementStructs
  {
        int ElementPosition;
        char* ElementValue;
  } ElementStructs;

/**************  Nothing else in the module needs to be modified *************/



/******************************************************************************
* Base struct of list nodes, contains user information and link pointers.
* The "ElementStructs" typemark must be defined based on specific needs of the
* application.
******************************************************************************/
typedef struct LinkedListNodes
  {
   /* The user …
Run Code Online (Sandbox Code Playgroud)

c memory-leaks linked-list

4
推荐指数
1
解决办法
2659
查看次数