File size: 1,164 Bytes
8870024
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

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.,
        ))