【無限合わせ鏡】メディアアート作品を作る![Python/Opencv]

ドロステ効果
【Opencv】でメディアアート(ドロステ効果)を作る

こんにちは! けい(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にリセットしてという制御文です.

まとめ

今回は,あまり馴染みのないドロステ効果というものを使った,簡単なメディアアートを作ってみました.正直,これを作るまでドロステ効果なんて聞いたことがなかったです(笑)

これを使えば,直前の色をディスプレイ上に保存できますしかし,ディスプレイは普通は,直前の時間を保存できませんよね?
そこに,ドロステ効果の面白さがあると思います.

ではまた!

Youtube でも公開

次に見たい記事