こんにちは! けい(Twitter)です.
今回は,何となくOpencvでプログラムを書いて遊んでいたら,おもしろい現象を見つけたので,それを使ったメディアアート?的なものを紹介します.
目次
ドロステ効果
上のTwitterの動画は,ドロステ効果というものを使って表現しています.
ドロステ効果(ドロステこうか、オランダ語:Droste-effect)とは、再帰的な画像[1](紋章学における紋中紋)のもたらす効果のこと。あるイメージの中にそれ自身の小さなイメージが、その小さなイメージの中にはさらに小さなイメージが、その中にもさらに……と画像の解像度が許す限り果てしなく描かれる。ドロステ効果は、自己言及システムのストレンジ・ループ(Strange loop)の視覚的例である。
wikipedia より出典
要約すると,ある光景が無限に小さくなって繰り返されるということです.
これがよく使われているのが,合わせ鏡です.
ディスプレイでカメラがキャプチャした動画を表示して,さらにカメラがそのディスプレイを撮る・・・というように,無限に繰り返されるのを利用します.
ソースコード
import cv2
import numpy as np
import matplotlib.pyplot as plt
import random
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
count = 0
random_color = [(0,255,0),(0,0,255),(255,0,0),(0,242,255),(0,153,255),(221,255,0),(255,0,127),(193,182,255)]
choice = random.sample(random_color,4)
while True:
global count
global choice
ret, frame = cap.read()
if ret == False:
break
cv2.rectangle(frame,pt1=(50,50),pt2=(150,150),color=choice[0],thickness=-1)
cv2.rectangle(frame,pt1=(50,330),pt2=(150,430),color=choice[1],thickness=-1)
cv2.rectangle(frame,pt1=(490,330),pt2=(590,430),color=choice[2],thickness=-1)
cv2.rectangle(frame,pt1=(490,50),pt2=(590,150),color=choice[3],thickness=-1)
frame = cv2.resize(frame , (int(640*1.5), int(480*1.5)))
if count == 10:
choice = random.sample(random_color,4)
count = 0
cv2.imshow("Video", frame)
count +=1
k = cv2.waitKey(1)
if k == 27:
print(frame.shape)
print(frame.shape[:2][::-1])
print(type(frame[0][0][0]))
print(frame)
break
cap.release()
cv2.destroyAllWindows()
解説
OpencvでUSBカメラから動画を取り込む方法については,こちらの方の記事が参考になるかと思います.
今回作るプログラムは
- 8色のうちランダムなものを4つ選ぶ
- 4つの四角形を画面の四方に配置
それを繰り返すだけの,シンプルなコードです.
これだけで面白い映像を作ることができます.
ランダムにリストを選択する
色は初めにリストで用意しておきます.変数random_colorです.
このリストから,毎回ランダムで4色を重複なしで選択します.
random.sample(random_color,4)
random.sample関数で重複なしでリストを数指定で選択できます.
わざと遅れさせる
変数countを用意して,四角形の更新をわざと遅れさせます.これがないと,目がちかちかします(笑)
if文でcountが10になったら,0にリセットしてという制御文です.
まとめ
今回は,あまり馴染みのないドロステ効果というものを使った,簡単なメディアアートを作ってみました.正直,これを作るまでドロステ効果なんて聞いたことがなかったです(笑)
これを使えば,直前の色をディスプレイ上に保存できます.しかし,ディスプレイは普通は,直前の時間を保存できませんよね?
そこに,ドロステ効果の面白さがあると思います.
ではまた!
コメントを残す