RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-445490

Fire13nyu's questions

Martin Hope
Fire13nyu
Asked: 2022-07-30 17:59:56 +0000 UTC

旋转投影相机的实现

  • 4

我正在尝试将空间中的点投影到图像上。我的投影相机需要在俯仰、滚动和偏航中旋转。我也知道对于 ,投影矩阵P = K*[R|t]的K = [fx,0,cx; 0,fy,cy; 0,0,1]形式t = [1,0,0,-xc; 0,1,0,-yc; 0,0,1,-zc]为 yc,zc) ,其中相机所在的位置。那些。此外,为了获得图像上点的坐标,您需要计算u = x/z和v = y/z,其中[x;y;z] = P*[X;Y;Z;1]。我的问题似乎出在旋转后的显示上,因为没有它显示是正确的:我显示红点,相机矩阵的大小为 [w,h],黑线是世界坐标系,彩色线是相机坐标系。在此处输入图像描述

在此处输入图像描述

问题是要了解需要更改或添加的内容,以便在转弯时不会出现故障。

我的设计功能:

function [u,v,P,R,point1,pointNew] = point2camProjection(point,f,w,h,xc,yc,zc,alpha,beta,gamma,cx,cy)
  pix=6.5e-3; %mm
  K = [f/pix,0,cx; 0,f/pix,cy; 0,0,1]; % camera calibration matrix
  
  %alpha - altitude (pitch) - Y
  %beta - heading (yaw) - Z -> X
  %gamma - bank (roll) - X -> Z
  R_heading = quaternion(cos(beta/2),sin(beta/2),0,0);
  R_alt     = quaternion(cos(alpha/2),0,sin(alpha/2),0);
  R_bank    = quaternion(cos(gamma/2),0,0,sin(gamma/2));
  
  R = R_heading*R_alt*R_bank;
  
  axX = quaternion(0,1,0,0);
  axY = quaternion(0,0,1,0);
  axZ = quaternion(0,0,0,1);
  
  axX = R*axX*conj(R);
  axY = R*axY*conj(R);
  axZ = R*axZ*conj(R);

  line([xc xc+axX.x*5000],[yc yc+axX.y*5000],[zc zc+axX.z*5000],'color','g','linewidth',2); % X
  line([xc xc+axY.x*5000],[yc yc+axY.y*5000],[zc zc+axY.z*5000],'color','m','linewidth',2); %Y
  line([xc xc+axZ.x*5000],[yc yc+axZ.y*5000],[zc zc+axZ.z*5000],'color','c','linewidth',2); %Z
  
  pix=6.5e-3; %mm
  
  q1 = R*4*quaternion(0,-w/2,h/2,f/pix)*conj(R);
  q2 = R*4*quaternion(0,-w/2,-h/2,f/pix)*conj(R);
  q3 = R*4*quaternion(0,w/2,-h/2,f/pix)*conj(R);
  q4 = R*4*quaternion(0,w/2,h/2,f/pix)*conj(R);

  mat = [R.w^2+R.x^2-R.y^2-R.z^2, 2*(R.x*R.y-R.w*R.z), 2*(R.x*R.z+R.w*R.y);...
         2*(R.x*R.y+R.w*R.z), R.w^2-R.x^2+R.y^2-R.z^2, 2*(R.y*R.z-R.w*R.x);...
         2*(R.x*R.z-R.w*R.y), 2*(R.y*R.z+R.w*R.x), R.w^2-R.x^2-R.y^2+R.z^2];
  T = [1,0,0,-xc;0,1,0,-yc;0,0,1,-zc];
  P = K*mat*T; % camera matrix
 
  [m,n]=size(point);
  point1 = [];
  point2 = [];
  phi1 = atan(w*pix/(2*f)); % Oxz
  phi2 = atan(h*pix/(2*f)); % Oyz
  Cconj = conj(R)*quaternion(0,xc,yc,zc)*R;
  
  for k=1:m
    point_conj = conj(R).*quaternion(0,point(k,1),point(k,2),point(k,3))*R;
    if abs(point_conj.x-Cconj.x)<abs(point_conj.z-Cconj.z)*tan(phi1) && ...
       abs(point_conj.y-Cconj.y)<abs(point_conj.z-Cconj.z)*tan(phi2) && ...
       point_conj.z>=Cconj.z
       point1 = [point1; point(k,:)];
    end
  end
    
  [m,n] = size(point1);
  homogen_point=[];
  if m~=0
    homogen_point = [point1,ones(m,1)];
  end
  pointNew = [];
  [m,n] = size(homogen_point);
  if m~=0 
      
    for k = 1:m
      pointNew = [pointNew; (P*homogen_point(k,:)')'];
    end
    u = pointNew(:,1)./pointNew(:,3);
    v = pointNew(:,2)./pointNew(:,3);
  else
    u=[];
    v=[];
  end

在相机所在的给定点的构造:

f=4.5; %mm
w=2042; h=1856; %pixels
##
al=pi*(rand()-0.5);
bet=2*pi*(rand()-0.5);
g=2*pi*(rand()-0.5);

##al=0;
##bet=0;
##g=0;

points = [Px'; Py'; Pz']';
[u,v,P,R,point1,pointNew] = point2camProjection(points,f,w,h,xc,yc,zc,al,bet,g,w/2-1, h/2-1);
[p1,p2] = size(point1);
if p1~=0 && p2~=0
  plot3(point1(:,1),point1(:,2),point1(:,3),'ro')
end
if length(u)~=0
  
##  plot3(pointNew(:,1)./pointNew(:,3),pointNew(:,2)./pointNew(:,3),ones(p1,1),'+g')
  
  figure; grid on; hold on;
  UV=[];
  for k=1:length(u)
  ##  if (u(k)<=w)&(v(k)<=h)&&(u(k)>=0)&(v(k)>=0)
      UV=[UV;[u(k),v(k)]];
  ##  end
  end
  if length(UV)==0
    disp(['al = ' num2str(al) ', bet = ' num2str(bet) ', g = ' num2str(g)])
  else
    plot(UV(:,1),UV(:,2),'m.')
  ##  xlim([0 w]); ylim([0 h]);
    line([0 0],[0 h],'color','k','linewidth',2);
    line([w w],[0 h],'color','k','linewidth',2);
    line([0 w],[0 0],'color','k','linewidth',2);
    line([0 w],[h h],'color','k','linewidth',2);
    xlabel('u'); ylabel('v');
    title(['al=' num2str(rad2deg(al)) ', bet=' num2str(rad2deg(bet)) ', g=' num2str(rad2deg(g))])
    axis equal;
  end
end

椭圆是由单独的代码设置的,所以最好不设置它。任意旋转的示例(黑框 - 图像尺寸,蓝轴 - OZ,绿色 - OX,覆盆子 - OY): 在此处输入图像描述 在此处输入图像描述

为了以防万一,我尝试了不使用四元数的旋转,但是通过将旋转矩阵乘以 X、Y 和 Z 周围的矩阵。但是,结果是相同的。我倾向于认为问题可能在于获取 u 和 v 坐标。

математика
  • 1 个回答
  • 10 Views
Martin Hope
Fire13nyu
Asked: 2022-07-29 21:27:32 +0000 UTC

查找金字塔区域内点的坐标

  • -1

给出了空间中的点数组。让我们将其中的一个点表示为P。从某个点C沿OZ轴绘制一个四棱锥,使其底边平行于轴OX和OY,并且四边形本身是一个矩形。OZ和棱锥面之间的角度也是已知的(设phi1是与底面平行于OX的面的角度,phi2是与底面平行于OY的面的角度)。任务是从给定数组的所有P中选择位于给定金字塔内的那些点。

此外,金字塔的高度是无限的,所以在尝试解决这个问题时,我试图精确地关注偏离高度的角度,它位于OZ上。

我的想法是这样的:

1) Пусть P = (Px, Py, Pz), C = (cx, cy, cz)
2) Pxz = (Px-cx, Py-cy), Pyz = (Py-cy, Py-cy)
3) Ox = (cx+1,cy,cz), Oy = (cx,cy+1,cz), Oz = (cx,cy,cz+1)
4) Далее ищем угол между Pxz и Oz (alpha) и угол между Pyz и Oz (beta)
5) Если |alpha|<=phi1 и |beta|<=phi2, то точка P нам подходит, иначе смотрим следующую точку.

但是,当我在 Matlab 中执行此操作时,结果不正确。图像显示了大图。蓝色、深红色和绿色线是建造金字塔的坐标系。蓝线是一个空间椭圆,其点是给定的数组。 在此处输入图像描述

математика
  • 1 个回答
  • 10 Views
Martin Hope
Fire13nyu
Asked: 2022-06-17 18:54:19 +0000 UTC

Haskell中函数卷积的工作

  • 2

再会!我最近开始在 haskell 中学习函数式编程。现在我有一个问题,函数卷积(折叠)是如何工作的。我想弄清楚,但我做不到。需要通过示例进行直截了当的解释。你可以举一些例子,可以这么说,拆解骨头。我阅读了来源,但由于某种原因,我没有得到所写的内容。因此,希望对您有所帮助!

haskell
  • 1 个回答
  • 10 Views
Martin Hope
Fire13nyu
Asked: 2022-06-09 20:35:41 +0000 UTC

解析几何:查找椭球和圆锥切点

  • 0

给定一个点P(xp,yp,zp)和一个椭球,其半轴和中心是已知的,它的方程:x^2/a^2+y^2/a^2+z^2/b^2=1。

点 P 位于椭球外一定距离处。从 绘制的椭圆体的切线集P形成一个圆锥曲面。有必要找到这个圆锥和椭球的接触点的一般形式(很明显,这些点将属于椭圆,也就是说,问题本质上归结为找到它们之间的接触椭圆方程圆锥体和椭球体)。

是否可以通过传递到球坐标来简化这里的问题?如果是,如何进行?如果不是,那么问题是一样的。

математика
  • 3 个回答
  • 10 Views
Martin Hope
Fire13nyu
Asked: 2022-05-29 02:19:20 +0000 UTC

Werlet集成方法的实现

  • 2

再会!我想在不使用速度的情况下实现 Verlet 集成方法(https://en.wikipedia.org/wiki/Verlet_integration),但我偶然发现了拥有当前坐标和以前坐标的问题。我正在介绍一个具有三个实例(一维、二维和多维案例)的坐标类:

class Coord coord where  
    infixl 6 +++
    (+++) :: coord -> coord -> coord
    infixl 7 ***
    (***) :: Double -> coord -> coord
    infixl 6 -.-
    (-.-) :: coord -> coord -> coord
    (-.-) coord1 coord2 = coord1 +++ (-1.0)***coord2

instance Coord Double where
    coord1 +++ coord2 = coord1 + coord2
    coord1 *** coord2 = coord1 * coord2

instance Coord (Double, Double) where
    (coord11,coord12) +++ (coord21,coord22) = (coord11+coord21,coord12+coord22)
    num *** (coord11,coord12) = (num*coord11,num*coord12)

instance Coord [Double] where 
    list1 +++ list2 = zipWith (+) list1 list2
    num *** list = map (* num) list

然后我用输入参数做积分函数本身:加速度(函数),初始坐标,初始速度和时间步长,并在每一步之后返回一个无限的点位置列表

verlet :: Coord coord => (coord -> coord) -> coord -> coord -> Double -> [coord]
verlet a x0 v0 dt = 
    let x1 = x0 +++ (dt***v0) +++ (0.5*(dt**2))***(a x0)
        verlet' xPrev xNow = let xNext = 2***xNow -.- xPrev +++ (dt**2))***(a xNow)
                            in (xPrev,xNow) : verlet' xNow xNext
    --- in (,) : verlet'  - вот тут проблема

如果有的话,我是一个真正的初学者,所以,很可能,这很容易解决,但它对我不起作用,所以我寻求帮助)

haskell
  • 2 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5