python

OpenCVでの画像処理入門:その2

画像の基礎知識

画像処理での約束事

1、画像処理では座標軸の原点は左上になる

数学の考え方では、左下を原点に考えると思いますが、画像処理では考え方が異なるので注意が必要です。
横にx軸、縦にy軸をとるのは変わりません。

OpenCV独自の約束事

その1でも触れましたが、画素の順番が(B, G, R)の順番で入っています。
これを考慮せずに、画像を出力すると想定していた通りの色にならないことがあります。

Numpyの約束事

numpyのarrayには、y, x, colorの順番で画素値を格納する。

# openCVモジュールのインポート
import cv2

# 画像の取り込み
img = cv2.imread('sample.jpg')
# yとxを抽出
h, w = img.shape[:2]

画像の特定の場所のcolorのblueの値を知りたい場合には、
img[200][400][0]のように指定してあげれば大丈夫です。

画像の表示・出力

ここからは、jupyter notebookもしくはjupyter labを使用してください。
そうしないと、画像の表示が少し面倒になります。

import cv2
import os # 画像の出力先ディレクトリ取得用

img = cv2.imread('sample.jpg')
img.shape

img[0][0] # color値を取得

# 画像の表示
cv2.imgshow('img', img) # 第一引数はwindowに表示する名前(任意でOK)
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
cv2.waitKey(1) & 0xFF # escキーで画像を閉じることが可能

# 画像の出力
os.mkdir('./output')
cv2.imwrite('output/test.jpg', img) # 第一引数は出力先のファイル名(任意でOK)

動画の表示・出力

import cv2
import sys

cap = cv2.VideoCapture('movie/sample.mp4')
if cap.isOpend() == False: # 動画を読み込まれていなければFalseを返す
  sys.exit() # 終了
# 1フレームだけ読み込み
ret, frame = cap.read() # 二つの戻り値が返ってくる=>値が取れていればretにはTrueが返ってくる
                        # frameには1フレームだけ読み込んだ画像が格納
h, w = frame.shape[:2]
fourcc = cv2.VideoWriter_fourcc(*'XVID') # コーデックの指定
dst = cv2.VideoWriter('test.avi', fourcc, 30.0, (w,h)) # 30.0=>fps (w,h)=>解像度

while True:
  ret, frame = cap.read()
  if ret == False:
    break
  cv2.imshow('img', frame)
  dst.write(frame) # 設定通りに書き込み
  if cv2.waitKey(30) & 0xFF:: # 30ms待っている間にescが押されたら
    break
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
cv2.waitKey(1)
cap.release()

書き込みを行っている影響で、通常のフレームレートより遅くなる傾向があります。

補足

windowの調整

cv2.nameWindowメソッドを使用することで、windowの調整が可能になります。

import cv2

img = cv2.imread('sample.jpg')
cv2.namedWindow('window', cv2.WINDOW_AUTOSIZE) # デフォルト
cv2.namedWindow('window', cv2.WINDOW_NORMAL) # windowを可変可能

cv2.reseizeWindow('window', 640, 480) # 解像度の指定

cv2.imshow('window', img)
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
cv2.waitKey(1) & 0xFF # escキーで画像を閉じることが可能