Python
OpenCV

OpenCV2 + Pythonで背景を単色で埋める

More than 3 years have passed since last update.

OpenCVで画面を初期化するときに、背景に色つけたいなーと思ったのですが、思った以上に四苦八苦したのでメモ。


この記事で行うこと


  • OpenCV2 + Pythonで画面を初期化する時に色を付ける方法を考える


四苦八苦するポイント

cv::Matの基本処理を見ると、OpenCV1は、画像データとしてIplImageという構造体を使うのに対して、OpenCV2はcv::Matというクラスを使う形に変わっています。

OpenCV1では、cvCreateImageで初期化しているのですが、この部分をOpenCV2でどうするかがポイントです。

Pythonの場合は、numpyの配列構造がそのまま使えるので、慣れてくると簡単なんだろうなと思いつつ、慣れていないのでOpenCV1のCのサンプルをどのようにしたらいいのかわからんのです。


いろいろ調べて試してみた

インターネットを潜ると、いろいろな方法があったので、並べてみました。ちなみに、OpenCVで画像を表示するときは色の並び順がBGRになります。


example_colorfill.py

# coding: UTF-8

import numpy as np
import cv2

# 10 x 10 の3レイヤー(BGR)を定義
size = 10, 10, 3

# cv2.fillPolyで赤に埋める
red_img = np.zeros(size, dtype=np.uint8)
contours = np.array( [ [0,0], [0,10], [10, 10], [10,0] ] )
cv2.fillPoly(red_img, pts =[contours], color=(0,0,255))

# cv2.rectangleで青に埋める
blue_img = np.zeros(size, dtype=np.uint8)
cv2.rectangle(blue_img,(0,0),(10,10),(255,0,0),cv2.cv.CV_FILLED)

# np.fillで白に埋める
white_img = np.zeros(size, dtype=np.uint8)
white_img.fill(255)

# np.tileで緑に埋める
green_img = np.tile(np.uint8([0,255,0]), (10,10,1))

# 10 x 10 の単階調で灰色に埋める
gray_img = np.tile(np.uint8([127]), (10,10,1))

# リストの最初から最後までを紫に埋める
# 参考: http://stackoverflow.com/questions/4337902/how-to-fill-opencv-image-with-one-solid-color
purple_img = np.zeros(size, dtype=np.uint8)
purple_img[:] = (255, 0, 255)

# RGBの並びをBGRに変換して黄色に埋める
yellow_img = np.zeros(size, dtype=np.uint8)
rgb_color = (255,255,0);
yellow_img[:] = tuple(reversed(rgb_color))

cv2.namedWindow("yellow image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("yellow image",yellow_img)
cv2.namedWindow("purple image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("purple image",purple_img)
cv2.namedWindow("gray image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("gray image",gray_img)
cv2.namedWindow("green image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("green image",green_img)
cv2.namedWindow("white image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("white image",white_img)
cv2.namedWindow("red image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("red image",red_img)
cv2.namedWindow("blue image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("blue image",blue_img)
cv2.waitKey(0)


実行すると、それぞれの色で埋められた画像が表示されます。


おすすめ

最初に0で埋めてリスト操作で色埋めする方法と、np.tileで最初から色で埋めてしまう方法のどちらかかなと思います。

どちらにしても、C++とはいまいち互換性のなさそうな部分ですね。