mirror of
https://github.com/opencv/opencv.git
synced 2024-12-16 02:19:12 +08:00
ad568edd7f
This change replaces references to a number of deprecated NumPy type aliases (np.bool, np.int, np.float, np.complex, np.object, np.str) with their recommended replacement (bool, int, float, complex, object, str). Those types were deprecated in 1.20 and are removed in 1.24, cf https://github.com/numpy/numpy/pull/22607.
120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
|
|
# Python 2/3 compatibility
|
|
from __future__ import print_function
|
|
|
|
import numpy as np
|
|
from numpy import pi, sin, cos
|
|
|
|
import cv2 as cv
|
|
|
|
defaultSize = 512
|
|
|
|
class TestSceneRender():
|
|
|
|
def __init__(self, bgImg = None, fgImg = None, deformation = False, noise = 0.0, speed = 0.25, **params):
|
|
self.time = 0.0
|
|
self.timeStep = 1.0 / 30.0
|
|
self.foreground = fgImg
|
|
self.deformation = deformation
|
|
self.noise = noise
|
|
self.speed = speed
|
|
|
|
if bgImg is not None:
|
|
self.sceneBg = bgImg.copy()
|
|
else:
|
|
self.sceneBg = np.zeros(defaultSize, defaultSize, np.uint8)
|
|
|
|
self.w = self.sceneBg.shape[0]
|
|
self.h = self.sceneBg.shape[1]
|
|
|
|
if fgImg is not None:
|
|
self.foreground = fgImg.copy()
|
|
self.center = self.currentCenter = (int(self.w/2 - fgImg.shape[0]/2), int(self.h/2 - fgImg.shape[1]/2))
|
|
|
|
self.xAmpl = self.sceneBg.shape[0] - (self.center[0] + fgImg.shape[0])
|
|
self.yAmpl = self.sceneBg.shape[1] - (self.center[1] + fgImg.shape[1])
|
|
|
|
self.initialRect = np.array([ (self.h/2, self.w/2), (self.h/2, self.w/2 + self.w/10),
|
|
(self.h/2 + self.h/10, self.w/2 + self.w/10), (self.h/2 + self.h/10, self.w/2)]).astype(int)
|
|
self.currentRect = self.initialRect
|
|
np.random.seed(10)
|
|
|
|
def getXOffset(self, time):
|
|
return int(self.xAmpl*cos(time*self.speed))
|
|
|
|
|
|
def getYOffset(self, time):
|
|
return int(self.yAmpl*sin(time*self.speed))
|
|
|
|
def setInitialRect(self, rect):
|
|
self.initialRect = rect
|
|
|
|
def getRectInTime(self, time):
|
|
|
|
if self.foreground is not None:
|
|
tmp = np.array(self.center) + np.array((self.getXOffset(time), self.getYOffset(time)))
|
|
x0, y0 = tmp
|
|
x1, y1 = tmp + self.foreground.shape[0:2]
|
|
return np.array([y0, x0, y1, x1])
|
|
else:
|
|
x0, y0 = self.initialRect[0] + np.array((self.getXOffset(time), self.getYOffset(time)))
|
|
x1, y1 = self.initialRect[2] + np.array((self.getXOffset(time), self.getYOffset(time)))
|
|
return np.array([y0, x0, y1, x1])
|
|
|
|
def getCurrentRect(self):
|
|
|
|
if self.foreground is not None:
|
|
|
|
x0 = self.currentCenter[0]
|
|
y0 = self.currentCenter[1]
|
|
x1 = self.currentCenter[0] + self.foreground.shape[0]
|
|
y1 = self.currentCenter[1] + self.foreground.shape[1]
|
|
return np.array([y0, x0, y1, x1])
|
|
else:
|
|
x0, y0 = self.currentRect[0]
|
|
x1, y1 = self.currentRect[2]
|
|
return np.array([x0, y0, x1, y1])
|
|
|
|
def getNextFrame(self):
|
|
img = self.sceneBg.copy()
|
|
|
|
if self.foreground is not None:
|
|
self.currentCenter = (self.center[0] + self.getXOffset(self.time), self.center[1] + self.getYOffset(self.time))
|
|
img[self.currentCenter[0]:self.currentCenter[0]+self.foreground.shape[0],
|
|
self.currentCenter[1]:self.currentCenter[1]+self.foreground.shape[1]] = self.foreground
|
|
else:
|
|
self.currentRect = self.initialRect + int( 30*cos(self.time) + 50*sin(self.time/3))
|
|
if self.deformation:
|
|
self.currentRect[1:3] += int(self.h/20*cos(self.time))
|
|
cv.fillConvexPoly(img, self.currentRect, (0, 0, 255))
|
|
|
|
self.time += self.timeStep
|
|
|
|
if self.noise:
|
|
noise = np.zeros(self.sceneBg.shape, np.int8)
|
|
cv.randn(noise, np.zeros(3), np.ones(3)*255*self.noise)
|
|
img = cv.add(img, noise, dtype=cv.CV_8UC3)
|
|
return img
|
|
|
|
def resetTime(self):
|
|
self.time = 0.0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
backGr = cv.imread('../../../samples/data/lena.jpg')
|
|
|
|
render = TestSceneRender(backGr, noise = 0.5)
|
|
|
|
while True:
|
|
|
|
img = render.getNextFrame()
|
|
cv.imshow('img', img)
|
|
|
|
ch = cv.waitKey(3)
|
|
if ch == 27:
|
|
break
|
|
cv.destroyAllWindows()
|