У меня есть сценарий использования, в котором я хочу вставить один из двух водяных знаков - один предназначен для темного фона, другой - для светлого фона в видео. Допустим, я бы хотел сделать это в правом верхнем углу видео.
Как определить средний цвет верхней правой части видео? Опубликуйте это, как определить, какой водяной знак использовать, посмотрев на средний цвет?
У меня сейчас есть решение, где я делаю скриншоты с равным интервалом, а затем измеряю средний цвет, но это мучительно медленно, особенно для длинных видео.
# Calculate average color
black_distances = []
white_distances = []
movie = FFMPEG::Movie.new(video_file)
(0..movie.duration / 10).each do |second|
# extract a frame
filename = "tmp/watermark/#{SecureRandom.uuid}.jpg"
movie.screenshot filename.to_s, seek_time: second
# analyse frame for color distance
frame = MiniMagick::Image.open(filename)
frame.crop('20%x20%+80%+0')
frame.resize('1x1')
pixel = frame.get_pixels.flatten
distance_from_black = Math.sqrt(((black[0] - pixel[0])**2 + (black[1] - pixel[1])**2 + (black[2] - pixel[2])**2))
distance_from_white = Math.sqrt(((white[0] - pixel[0])**2 + (white[1] - pixel[1])**2 + (white[2] - pixel[2])**2))
black_distances.push distance_from_black
white_distances.push distance_from_white
File.delete(filename) if File.exist?(filename)
end
average_black_distance = black_distances.reduce(:+).to_f / black_distances.size
average_white_distance = white_distances.reduce(:+).to_f / white_distances.size
Я также не совсем понимаю, как использовать полученные значения average_black_distance
и average_white_distance
, чтобы определить, какой водяной знак использовать.