Ankan Ghosh
Upload billboard.py
6583bf5 verified
import cv2
import numpy as np
# Create a named window for the display.
win_name = 'Destination Image'
# ------------------------------------------------------------------------------
# Define mouse callback function.
# ------------------------------------------------------------------------------
def mouse_handler(event, x, y, flags, data):
if event == cv2.EVENT_LBUTTONDOWN:
# Render points as yellow circles in destination image.
cv2.circle(data['img'], (x, y), radius=5, color=(0, 255, 255), thickness=-1, lineType=cv2.LINE_AA)
cv2.imshow(win_name, data['img'])
if len(data['points']) < 4:
data['points'].append([x, y])
# ------------------------------------------------------------------------------
# Define convenience function for retrieving ROI points in destination image.
# ------------------------------------------------------------------------------
def get_roi_points(img):
# Set up data to send to mouse handler.
data = {'img': img.copy(), 'points': []}
# Set the callback function for any mouse event.
cv2.imshow(win_name, img)
cv2.setMouseCallback(win_name, mouse_handler, data)
cv2.waitKey(0)
# Convert the list of four separate 2D ROI coordinates to an array.
roi_points = np.vstack(data['points']).astype(float)
return roi_points
# ------------------------------------------------------------------------------
# Main function to apply homography and warp images.
# ------------------------------------------------------------------------------
def apply_homography_and_warp(img_src, img_dst, roi_dst):
# Compute the coordinates for the four corners of the source image.
size = img_src.shape
src_pts = np.array([[0, 0], [size[1] - 1, 0], [size[1] - 1, size[0] - 1], [0, size[0] - 1]], dtype=float)
# Compute the homography.
h, status = cv2.findHomography(src_pts, roi_dst)
# Warp source image onto the destination image.
warped_img = cv2.warpPerspective(img_src, h, (img_dst.shape[1], img_dst.shape[0]))
# Black out polygonal area in destination image.
cv2.fillConvexPoly(img_dst, roi_dst.astype(int), 0, 16)
# Add the warped image to the destination image.
img_dst = img_dst + warped_img
return img_dst
# ------------------------------------------------------------------------------
# Main program
# ------------------------------------------------------------------------------
# # Read the source image.
# img_src = cv2.imread('Apollo-8-Launch.png')
# # Read the destination image.
# img_dst = cv2.imread('times_square.jpg')
# # Get four corners of the billboard
# print('Click on four corners of a billboard and then press ENTER')
# # Retrieve the ROI points from the user mouse clicks.
# roi_dst = get_roi_points(img_dst)
# # Apply homography and warp the images.
# result_img = apply_homography_and_warp(img_src, img_dst, roi_dst)
# # Display the updated image with the virtual billboard.
# cv2.imshow(win_name, result_img)
# # Wait for a key to be pressed to exit.
# cv2.waitKey(0)
# # Close the window.
# cv2.destroyAllWindows()