【发布时间】:2021-09-06 07:39:12
【问题描述】:
我正在从图像中提取对象并将其叠加到背景上以生成用于计算机视觉任务的场景。每次生成场景时都会添加随机定位、大小、旋转和过滤。
我面临的问题是,除非对象是一个完美的垂直矩形,否则在覆盖图像时会出现黑色边框。
叠加时如何使轮廓外的区域透明?
在下面找到一些示例代码和输出。
import cv2
from matplotlib import pyplot as plt
from skimage import io
#Import Card
card = io.imread('https://i.ebayimg.com/thumbs/images/g/BZoAAOSwj0RfkZuD/s-l225.jpg')
plt.imshow(card)
#Import Background
background = io.imread('https://www.robots.ox.ac.uk/~vgg/data/dtd/images/cracked/cracked_0049.jpg')
plt.imshow(background)
#Find contours and extract card
edged=cv2.Canny(card,30,200)
contours, hierarchy=cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
contour = [c for c in contours if c.size >=1300][0]
#Crop out background
x,y,w,h = cv2.boundingRect(contour)
card_cropped = card[y:y+h, x:x+w]
#Resize
card_cropped_resized = cv2.resize(card_cropped, (int(card_cropped.shape[1]/0.8), int(card_cropped.shape[0]/0.8)))
#Generate Scene
card_cropped_resized_grayscale = cv2.cvtColor(card_cropped_resized, cv2.COLOR_RGB2GRAY)
background_grayscale = cv2.cvtColor(background, cv2.COLOR_RGB2GRAY)
h, w = card_cropped_resized_grayscale.shape[:2]
hh, ww = background_grayscale.shape[:2]
yoff = round(hh/4)
xoff = round(ww/4)
xMin = xoff
yMin = yoff
xMax = xoff+w
yMax = yoff+h
scene = background_grayscale.copy()
scene[yMin:yMax, xMin:xMax] = card_cropped_resized_grayscale
plt.imshow(cv2.cvtColor(scene,cv2.COLOR_GRAY2RGB))
【问题讨论】:
标签: python opencv computer-vision cv2