|
|
|
|
|
|
|
import cv2 |
|
import numpy as np |
|
import chumpy as ch |
|
from chumpy import Ch, depends_on |
|
from chumpy.utils import col |
|
from opendr.geometry import Rodrigues |
|
|
|
|
|
class OrthoProjectPoints(Ch): |
|
terms = 'near', 'far', 'width', 'height' |
|
dterms = 'v', 'rt', 't', 'left', 'right', 'bottom', 'top' |
|
|
|
def compute_r(self): |
|
return self.r_and_derivatives.r |
|
|
|
def compute_dr_wrt(self, wrt): |
|
if wrt not in [self.v, self.rt, self.t, self.left, self.right, self.bottom, self.top]: |
|
return None |
|
|
|
return self.r_and_derivatives.dr_wrt(wrt) |
|
|
|
@depends_on('t', 'rt') |
|
def view_mtx(self): |
|
R = cv2.Rodrigues(self.rt.r)[0] |
|
return np.hstack((R, col(self.t.r))) |
|
|
|
@property |
|
def r_and_derivatives(self): |
|
tmp = self.v.dot(Rodrigues(self.rt)) + self.t |
|
|
|
return ch.hstack(( |
|
col(2. / (self.right - self.left) * tmp[:, 0] - (self.right + self.left) / (self.right - self.left) + 1.) * self.width / 2., |
|
col(2. / (self.bottom - self.top) * tmp[:, 1] - (self.bottom + self.top) / (self.bottom - self.top) + 1.) * self.height / 2., |
|
)) |
|
|
|
|