# Homography matrix

**URL:** <https://forum.opencv.org/t/homography-matrix/18095>\
**Category:** Python\
**Tags:** calib3d\
**Created:** [June 27, 2024, 9:33am UTC](https://forum.opencv.org/t/homography-matrix/18095 "2024-06-27T09:33:06Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Aniruth\_Sundararajan](https://sea2.discourse-cdn.com/flex020/user_avatar/forum.opencv.org/aniruth_sundararajan/32/10707_2.png) [@Aniruth\_Sundararajan](https://forum.opencv.org/u/Aniruth_Sundararajan)\
**Post date:** [June 27, 2024, 9:33am UTC](https://forum.opencv.org/t/homography-matrix/18095/1 "2024-06-27T09:33:06Z")

</div>

I have multi camera view of the same region.  
For both the cameras , I am having the camera calibration parameters.  
Using that I got the Transformation matrix from camera 1 view to camera 2 view.

Now , using an deep learning algorithm , I have the bounding boxes of people in camera 1 , and i want to get the corresponding bbox of people in camera 2 . When i tried transforming bbox coordinate from view 1 to view 2 , all the coordinate values in view 2 are way out of range than the actual image size. i,e i am getting a coordinate point as (840 , 500) , while my actual image size is (120 , 480) (both cameras)

What should i do to solve it.

My Code

def parse\_camera\_parameters(xml\_file):  
tree = ET.parse(xml\_file)  
root = tree.getroot()

```
geometry_elem = root.find('Geometry')
intrinsic_elem = root.find('Intrinsic')
extrinsic_elem = root.find('Extrinsic')

camera_params = {
    'geometry': {
        'width': float(geometry_elem.attrib.get('width', '0')),
        'height': float(geometry_elem.attrib.get('height', '0'))
    },
    'intrinsic': {
        'focal': float(intrinsic_elem.get('focal', '0')),
        'kappa1': float(intrinsic_elem.get('kappa1', '0')),
        'cx': float(intrinsic_elem.get('cx', '0')),
        'cy': float(intrinsic_elem.get('cy', '0')),
        'sx': float(intrinsic_elem.get('sx', '0'))
    },
    'extrinsic': {
        'tx': float(extrinsic_elem.get('tx', '0')),
        'ty': float(extrinsic_elem.get('ty', '0')),
        'tz': float(extrinsic_elem.get('tz', '0')),
        'rx': float(extrinsic_elem.get('rx', '0')),
        'ry': float(extrinsic_elem.get('ry', '0')),
        'rz': float(extrinsic_elem.get('rz', '0'))
    }
}

return camera_params

```

def compute\_homography(cam1\_params, cam2\_params):  
# Intrinsic parameters of camera 1  
K1 = np.array([  
[cam1\_params[‘intrinsic’][‘focal’], 0, cam1\_params[‘intrinsic’][‘cx’]],  
[0, cam1\_params[‘intrinsic’][‘focal’] \* cam1\_params[‘intrinsic’][‘sx’], cam1\_params[‘intrinsic’][‘cy’]],  
[0, 0, 1]  
])

```
# Extrinsic parameters of camera 1
R1 = np.array([
    [1, 0, 0],
    [0, np.cos(cam1_params['extrinsic']['rx']), -np.sin(cam1_params['extrinsic']['rx'])],
    [0, np.sin(cam1_params['extrinsic']['rx']), np.cos(cam1_params['extrinsic']['rx'])]
]) @ np.array([
    [np.cos(cam1_params['extrinsic']['ry']), 0, np.sin(cam1_params['extrinsic']['ry'])],
    [0, 1, 0],
    [-np.sin(cam1_params['extrinsic']['ry']), 0, np.cos(cam1_params['extrinsic']['ry'])]
]) @ np.array([
    [np.cos(cam1_params['extrinsic']['rz']), -np.sin(cam1_params['extrinsic']['rz']), 0],
    [np.sin(cam1_params['extrinsic']['rz']), np.cos(cam1_params['extrinsic']['rz']), 0],
    [0, 0, 1]
])

t1 = np.array([[cam1_params['extrinsic']['tx']], [cam1_params['extrinsic']['ty']], [cam1_params['extrinsic']['tz']]])

RT1 = np.hstack((R1, t1))

K2 = np.array([
    [cam2_params['intrinsic']['focal'], 0, cam2_params['intrinsic']['cx']],
    [0, cam2_params['intrinsic']['focal'] * cam2_params['intrinsic']['sx'], cam2_params['intrinsic']['cy']],
    [0, 0, 1]
])

R2 = np.array([
    [1, 0, 0],
    [0, np.cos(cam2_params['extrinsic']['rx']), -np.sin(cam2_params['extrinsic']['rx'])],
    [0, np.sin(cam2_params['extrinsic']['rx']), np.cos(cam2_params['extrinsic']['rx'])]
]) @ np.array([
    [np.cos(cam2_params['extrinsic']['ry']), 0, np.sin(cam2_params['extrinsic']['ry'])],
    [0, 1, 0],
    [-np.sin(cam2_params['extrinsic']['ry']), 0, np.cos(cam2_params['extrinsic']['ry'])]
]) @ np.array([
    [np.cos(cam2_params['extrinsic']['rz']), -np.sin(cam2_params['extrinsic']['rz']), 0],
    [np.sin(cam2_params['extrinsic']['rz']), np.cos(cam2_params['extrinsic']['rz']), 0],
    [0, 0, 1]
])

t2 = np.array([[cam2_params['extrinsic']['tx']], [cam2_params['extrinsic']['ty']], [cam2_params['extrinsic']['tz']]])

RT2 = np.hstack((R2, t2))

H = K2 @ RT2 @ np.linalg.pinv(RT1) @ np.linalg.pinv(K1)
    
return H

```

Code

xml\_file\_cam1 = ‘calibration\_cam0.xml’

xml\_file\_cam2 = ‘calibration\_cam1.xml’

camera\_params\_cam1 = parse\_camera\_parameters(xml\_file\_cam1)

camera\_params\_cam2 = parse\_camera\_parameters(xml\_file\_cam2)

image\_cam1 = cv2.imread(‘RLCAFTCONF-C0\_100000.jpeg’)

model1, model2, model3 = load\_models()

bbox\_cam1, labels\_cam1, ids\_cam1, confs\_cam1, image\_with\_bboxes\_cam1, final\_bbs\_cam1 = run\_object\_detection(image\_cam1, model1, model2, model3)

H\_cam1\_to\_cam2 = compute\_homography(camera\_params\_cam1, camera\_params\_cam2)  
bbox\_cam2 =   
for bid, bbox in enumerate(bbox\_cam1):  
x1, y1, x2, y2 = bbox  
pt\_tl = np.array([[x1, y1]], dtype=np.float32).reshape(-1, 1, 2)  
transformed\_pt\_tl = cv2.perspectiveTransform(pt\_tl, H\_cam1\_to\_cam2)

```
pt_br = np.array([[x2, y2]], dtype=np.float32).reshape(-1, 1, 2)
transformed_pt_br = cv2.perspectiveTransform(pt_br, H_cam1_to_cam2)

x1_trans, y1_trans = transformed_pt_tl[0][0]
x2_trans, y2_trans = transformed_pt_br[0][0]
bbox_cam2.append([x1_trans, y1_trans, x2_trans, y2_trans])

```

image\_cam2 = cv2.imread(‘RLCAFTCONF-C1\_100000.jpeg’)

for bbox, id in zip(bbox\_cam1, ids\_cam1):  
x1, y1, x2, y2 = map(int, bbox)  
cv2.rectangle(image\_cam1, (x1, y1), (x2, y2), (0, 255, 0), 2)  
cv2.putText(image\_cam1, f’ID: {id}', (x1, y1 - 10), cv2.FONT\_HERSHEY\_SIMPLEX, 0.5, (0, 255, 0), 2)

print(bbox\_cam2)  
for bbox, id in zip(bbox\_cam2, ids\_cam1):  
x1, y1, x2, y2 = map(int, bbox)  
cv2.rectangle(image\_cam2, (x1, y1), (x2, y2), (0, 255, 0), 2)  
cv2.putText(image\_cam2, f’ID: {id}', (x1, y1 - 10), cv2.FONT\_HERSHEY\_SIMPLEX, 0.5, (0, 255, 0), 2)

comb = np.hstack((image\_cam1 , image\_cam2))

cv2.imwrite(‘combined.png’ , comb)

Output image

 ![image](https://us1.discourse-cdn.com/flex020/uploads/opencv/original/2X/9/9dc65be7cc98db524a60635a9ec0847d0f2a016d.jpeg)

---

<div class="post-metadata">

**Author:** ![crackwitz](https://sea2.discourse-cdn.com/flex020/user_avatar/forum.opencv.org/crackwitz/32/14_2.png) [@crackwitz](https://forum.opencv.org/u/crackwitz)\
**Post date:** [June 27, 2024, 9:40am UTC](https://forum.opencv.org/t/homography-matrix/18095/2 "2024-06-27T09:40:38Z")

</div>

do you have distance/depth information for your targets, or do you just assume that they’ll stand in a fixed plane for which that homography is valid?

---

<div class="post-metadata">

**Author:** ![Aniruth\_Sundararajan](https://sea2.discourse-cdn.com/flex020/user_avatar/forum.opencv.org/aniruth_sundararajan/32/10707_2.png) [@Aniruth\_Sundararajan](https://forum.opencv.org/u/Aniruth_Sundararajan)\
**Post date:** [June 27, 2024, 1:14pm UTC](https://forum.opencv.org/t/homography-matrix/18095/3 "2024-06-27T13:14:43Z")

</div>

I assume it’s a fixed plane
