# Adjust image rotation to camera rotation Hi,

I have written a program which blends a space shuttle icon into an image which is projected. My program, additionally, uses feature matching, homography and perspective transform so that the icon can be moved as the camera moves. In other words, move the camera over the projected image to move the icon around.

I am done with everything describe above. One thing I want to accomplish is to rotate the icon image with the camera. That is, do not always draw the icon as it is, rotate it to left and right when the camera rotates so.

Here is my code which blends the icon into the image:

# blend the shuttleIcon into the image
processedImage = cv2.cvtColor(processedImage, cv2.COLOR_BGR2BGRA)
w, h, c = shuttleIcon.shape

for i in range(0, w):
for j in range(0, h):
if shuttleIcon[i, j] != 0:
processedImage[trackedCenterPoint + i, trackedCenterPoint + j] = shuttleIcon[i, j]

processedImage = cv2.cvtColor(processedImage, cv2.COLOR_BGRA2BGR)


How can I incorporate the camera rotation into this? Any thoughts?

NOTE: I do not have the calibration matrix.

edit retag close merge delete

Sort by » oldest newest most voted OK. I got it. The following does the job:

'''Takes 2 vectors and returns the rotation matrix between these 2 vectors'''
def get_camera_rotation(homographyMatrix):
# Points in the camera frame
camera_pts = np.float32([[round(CAM_WIDTH / 2), round(CAM_HEIGHT / 2)],
[round(10 + CAM_WIDTH / 2), round(10 + CAM_HEIGHT / 2)]]).reshape(-1, 1, 2)
# Find these points in the projector image
proj_pts = cv2.perspectiveTransform(camera_pts, homographyMatrix)

# Find the vectors between the sets of points
camera_vector = (camera_pts - camera_pts, camera_pts - camera_pts)
proj_vector = (proj_pts - proj_pts, proj_pts - proj_pts)

# change the vectors to unit vectors
camera_vector = camera_vector / np.absolute(np.linalg.norm(camera_vector))
proj_vector = proj_vector / np.absolute(np.linalg.norm(proj_vector))

# calculate the angle between the 2 vectors
# Change the sign of the angle if the rocket is turning the opposite way to desired
#sine of the angle
sinAngle = camera_vector * proj_vector - camera_vector * proj_vector
#angle between the vectors
angle = np.arcsin(np.clip(sinAngle, -1.0, 1.0))

#print("The angle between the camera and the projector is:")
#print(angle)
# calculate the 2D rotation matrix from this angle
rotation_matrix = np.matrix([[np.cos(angle), -1 * np.sin(angle)], [np.sin(angle), np.cos(angle)]])
return angle


to use:

 # rotate the shuttle as the camera does
# first though, get a copy
toBeRotatedShuttle = shuttleIcon.copy()
rows, cols, w = toBeRotatedShuttle.shape
angle = get_camera_rotation(smoothenedMatrix)
angleInDegrees = round(math.degrees(math.asin(angle)),2) # convert radian to degrees
rotationMatrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), angleInDegrees, 1)
shuttleIcon = cv2.warpAffine(toBeRotatedShuttle, rotationMatrix, (cols, rows), cv2.INTER_AREA)

more

Official site

GitHub

Wiki

Documentation