Я пытаюсь добавить шахматную доску к изображению, чтобы найти коэффициенты искажения. Однако, когда я использую функцию addWeighted()
, черные области моей шахматной доски прозрачны.
Сначала я деформирую изображение шахматной доски с помощью функций findHomography()
и warpPerspective()
.
Затем я пытаюсь добавить изображение сцены и искривленной шахматной доски вместе с addWeighted()
. Что мне нужно сделать, чтобы он не был прозрачным?
Изменить код:
input_1 = cv2.imread('RV_CV_Assignment_3_image_1.jpg')
imageSize = input_1.shape[:2]
chessboard = cv2.imread('Chessboard.jpg')
boardSize = np.float32([[0,0],[3632,0],[0,2816],[3632,2816]])
# These are the corner coordinates for the chessboard in the image. For now I do this manually
cornersBoard1 = np.float32([[348,233],[2004,233],[291,1555],[2025,1555]])
homography1, status1 = cv2.findHomography(boardSize,cornersBoard1)
warpBoard1 = cv2.warpPerspective(chessboard, homography1, (imageSize[1], imageSize[0]))
imgChessboard1 = cv2.addWeighted(input_1, 1, warpBoard1, 1, 0)
cv2.namedWindow('Chessboard in image 1', cv2.WINDOW_NORMAL)
cv2.imshow('Chessboard in image 1',imgChessboard1)
Вы добавляете значения пикселей шахматной доски. Таким образом, добавление черных пикселей (0) не меняет основное изображение. Может быть, попробуйте умножать вместо сложения: docs.opencv.org/3.4/d2/de8/…
@spkersten А, теперь понятно. Приветствую друга, который сделал работу!
Вот один из способов сделать это в Python/OpenCV. Убедитесь, что ваше изображение «шахматной доски» имеет черный цвет, сопоставленный с 1, а не с 0. Затем в вашей деформации перспективы убедитесь, что фон, не являющийся изображением, окрашен как чисто черный, то есть 0. Затем используйте np.where, чтобы смешать два изображения.
Вот ваш код изменен соответствующим образом,
import cv2
import numpy as np
input_1 = cv2.imread('buildings.jpg')
imageSize = input_1.shape[:2]
chessboard = cv2.imread('checks.png')
boardSize = np.float32([[0,0],[3632,0],[0,2816],[3632,2816]])
# modify chessboard to map (0,0,0) to (1,1,1) so no pure black
chessboard[np.where((chessboard == [0,0,0]).all(axis=2))] = [1,1,1]
# These are the corner coordinates for the chessboard in the image. For now I do this manually
cornersBoard1 = np.float32([[348,233],[2004,233],[291,1555],[2025,1555]])
homography1, status1 = cv2.findHomography(boardSize,cornersBoard1)
# make sure background of warpParspective is pure black
warpBoard1 = cv2.warpPerspective(chessboard, homography1, (imageSize[1], imageSize[0]), borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))
# use np.where to blend the two images with the chessboard over the buildings
imgChessboard1 = np.where(warpBoard1==0, input_1, warpBoard1)
cv2.namedWindow('Chessboard in image 1', cv2.WINDOW_NORMAL)
cv2.imshow('Chessboard in image 1',imgChessboard1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('checkerboard_on_buildings.jpg', imgChessboard1)
Результат:
Пожалуйста, опубликуйте два входных изображения и код. Ознакомьтесь с информационными руководствами в центр помощи (stackoverflow.com/help), в частности, «Как задать хороший вопрос» (stackoverflow.com/help/как спросить) и «Как создать минимальный воспроизводимый пример» (stackoverflow.com/help/минимально-воспроизводимый-пример).