LoginSignup
22
22

More than 5 years have passed since last update.

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

Posted at

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++とはいまいち互換性のなさそうな部分ですね。

22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22