トップページ -> 最新情報技術の実習と研究ツール -> OpenCV を使ってみる -> OpenCV で種々の画像処理
[サイトマップへ]  

OpenCV で種々の画像処理

Anaconda のインストール

Python 3 の開発環境である Anacondaをおすすめ.Window でのインストール手順は次の通りです(Linuxでも同様の手順です).

  1. https://www.continuum.io/downloads#windowsを開く

  2. Download」をクリックする.

  3. ダウンロードが始まるので確認する.

  4. ダウンロードした .exe ファイルを実行して,Anacondaをインストール.

    Python処理系にはいくつかの種類がある. この Web ページでは Anaconda をおすすめしている. 以下,Windows に Anacondaをインストールしたものとして説明を続ける.

  5. Windows で,コマンドプロンプトを管理者として実行

    ※ Linux の場合には,端末を開く(pyenvを使っているときは pip の実行に管理者権限を必要としない)

  6. まずは,最新の conda-build パッケージが欲しい.今のコマンドプロンプトで,次のコマンドを実行

    conda install -y conda-build
    

    ※ 「Proceed ([y]/n)?」と表示されたら, y + Enter で続行する.「反応が遅いなあ」と思ったら、Enter キーを押してみる.

  7. conda が更新されたので,コマンドプロンプトをいったん閉じる

  8. 再び,コマンドプロンプトを管理者として実行

  9. コマンドプロンプトで,次のコマンドを実行

    conda update -y pip
    conda update -y setuptools
    conda update -y conda
    conda update -y conda-build
    

    ※ 「Proceed ([y]/n)?」と表示されたら, y + Enter で続行する.「反応が遅いなあ」と思ったら、Enter キーを押してみる.


必要な Python パッケージのインストール手順

  1. Windows で,コマンドプロンプトを管理者として実行

    ※ Linux の場合には,端末を開く(pyenvを使っているときは pip の実行に管理者権限を必要としない)

  2. 今のコマンドプロンプトで,次のコマンドを実行

    ※ Anaconda や Miniconda を使っていないときは conda コマンドがないので pip コマンドを使ってください

    conda install numpy scipy 
    conda install -c conda-forge opencv 
    

    ※ 「Proceed ([y]/n)?」と表示されたら, y + Enter で続行する.「反応が遅いなあ」と思ったら、Enter キーを押してみる.


この Web ページで説明のために使用する画像とビデオ

lena.jpg

https://github.com/opencv/opencv/tree/master/samples/data で公開されている lena.jpg を使うことにします (感謝)

クリックしたら、ダウンロード画面に変わるので「Download」をクリック.

E:\ (E:\ の直下)にダウンロードしたものとして説明を続けます.

ビデオ

https://github.com/opencv/opencv/tree/master/samples/data で公開されている Megamind.avi を使うことにします (感謝)

クリックしたら、ダウンロード画面に変わるので「Download」をクリック.

E:\ (E:\ の直下)にダウンロードしたものとして説明を続けます.

夜間のドライブレコーダー画像(金子研究室で作成)

http://www.kunihikokaneko.com/dblab/opencv/00008.MTS

E:\ (E:\ の直下)にダウンロードしたものとして説明を続けます.


前景背景分離

GrabCut法による前景分離

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import numpy as np
import cv2
img = cv2.imread("E:/lena.jpg")
h, w = img.shape[:2]
mask = np.zeros((h,w), dtype = np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect=(1,1,w,h)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 10, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img2 = img*mask2[:,:,np.newaxis]
cv2.imshow("hoge2", img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

ビデオの背景除去(MOG2法による)

背景が黒,全景が白であるような濃淡画像を作る.

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
v = cv2.VideoCapture("E:/Megamind.avi")
fgbg = cv2.createBackgroundSubtractorMOG2()
while(v.isOpened()):
    r, f = v.read()
    fgmask = fgbg.apply(f)
    cv2.imshow("",fgmask)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

ビデオの背景除去(kNN法による)

背景が黒,全景が白であるような濃淡画像を作ること.別の手法

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
v = cv2.VideoCapture("E:/Megamind.avi")
fgbg = cv2.createBackgroundSubtractorKNN()
while(v.isOpened()):
    r, f = v.read()
    fgmask = fgbg.apply(f)
    cv2.imshow("",fgmask)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

ビデオの背景除去(MOG2法による)ののち,元画像と論理積

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
v = cv2.VideoCapture("E:/Megamind.avi")
fgbg = cv2.createBackgroundSubtractorMOG2()
while(v.isOpened()):
    r, f = v.read()
    fgmask = fgbg.apply(f)
    cv2.imshow("", cv2.bitwise_and(f, f, mask=fgmask))
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる


カラー画像と丸や線の重ね合わせ表示

丸の重ねあわせ

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
img = cv2.imread("E:/lena.jpg")
cv2.circle(img, (100, 100), 10, 255, -1)
cv2.imshow("hoge8", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

線の重ねあわせ

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
img = cv2.imread("E:/lena.jpg")
cv2.line(img, (100, 100), (200, 300), 10, 5, -1)
cv2.imshow("hoge9", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる


トラッキングビジョン

「トラッキングに適するポイント(追跡用の点)」を複数抜き出す(Shi-Tomasi の手法)ことをビデオで行ってみる

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
import numpy as np
v = cv2.VideoCapture("E:/Megamind.avi")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
while(v.isOpened()):
    r, f = v.read()
    g = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
    d = cv2.goodFeaturesToTrack(g, 80, 0.01, 5, 3)
    if d is not None:
        d = np.int0(d)
        for i in d:
            x,y = i.ravel()
            cv2.circle(f, (x,y), 10, 255, -1)
    cv2.imshow("", f)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

プログラムは同じで、ファイルを 00008.MTS に変えてみる

import cv2
import numpy as np
v = cv2.VideoCapture("E:/00008.MTS")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
while(v.isOpened()):
    r, f = v.read()
    g = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
    d = cv2.goodFeaturesToTrack(g, 80, 0.01, 5, 3)
    if d is not None:
        d = np.int0(d)
        for i in d:
            x,y = i.ravel()
            cv2.circle(f, (x,y), 10, 255, -1)
    cv2.imshow("", f)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる


オプティカルフロー

オプティカルフローは,ビデオから「動きの情報」を取り出す

オプティカルフロー(Farnebackの方法による)

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
import numpy as np
cap = cv2.VideoCapture("E:/Megamind.avi")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
while(1):
    ret, frame2 = cap.read()
    next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    # pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags
    flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
    hsv[...,0] = ang*180/np.pi/2
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
    cv2.imshow('source',frame2)
    cv2.imshow('flow',rgb)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    prvs = next
cap.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

プログラムは同じで、ファイルを 00008.MTS に変えてみる

import cv2
import numpy as np
cap = cv2.VideoCapture("E:/00008.MTS")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
while(1):
    ret, frame2 = cap.read()
    next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    # pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags
    flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
    hsv[...,0] = ang*180/np.pi/2
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
    cv2.imshow('source',frame2)
    cv2.imshow('flow',rgb)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    prvs = next
cap.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

背景除去+オプティカルフロー(Farnebackの方法による)

オプティカルフローは,ビデオから「動きの情報」を取り出す

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
import numpy as np
cap = cv2.VideoCapture("E:/Megamind.avi")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
fgbg = cv2.createBackgroundSubtractorMOG2()
fgmask = fgbg.apply(prvs)
prvs = cv2.bitwise_and(prvs, prvs, mask=fgmask)
while(1):
    ret, frame2 = cap.read()
    next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    fgmask = fgbg.apply(next)
    next = cv2.bitwise_and(next, next, mask=fgmask)
    # pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags
    flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
    hsv[...,0] = ang*180/np.pi/2
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
    cv2.imshow('source', prvs)
    cv2.imshow('flow',rgb)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    prvs = next
cap.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

プログラムは同じで、ファイルを 00008.MTS に変えてみる

import cv2
import numpy as np
cap = cv2.VideoCapture("E:/00008.MTS")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
fgbg = cv2.createBackgroundSubtractorMOG2()
fgmask = fgbg.apply(prvs)
prvs = cv2.bitwise_and(prvs, prvs, mask=fgmask)
while(1):
    ret, frame2 = cap.read()
    next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    fgmask = fgbg.apply(next)
    next = cv2.bitwise_and(next, next, mask=fgmask)
    # pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags
    flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
    hsv[...,0] = ang*180/np.pi/2
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
    cv2.imshow('source', prvs)
    cv2.imshow('flow',rgb)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    prvs = next
cap.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる


ステレオカメラからDepthMap の自動生成

Python 処理系」で次を実行. (Anacondaに入っている開発環境 spyder を実行し,左上の エディタ画面を使うのが簡単.編集が終わったら「実行ボタン」をクリック.

import cv2
import numpy as np
v = cv2.VideoCapture("E:/00008.MTS")
neiborhood8 = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], np.uint8)
fgbg = cv2.createBackgroundSubtractorMOG2()
while(v.isOpened()):
    r, f = v.read()
    fgmask = cv2.dilate( fgbg.apply(f), neiborhood8, iterations=4 )
    f2 = cv2.bitwise_and(f, f, mask=fgmask)
    h, w = f2.shape[:2]
    im0 = f2[0:h, 0:int(w/2), 0:3]
    im1 = f2[0:h, int(w/2):w, 0:3]
    mono0 = cv2.cvtColor(im0, cv2.COLOR_BGR2GRAY)
    mono1 = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
    stereo = cv2.StereoBM_create(blockSize= 15, numDisparities=64)
    disparity = stereo.compute(mono0, mono1)
    map = ( disparity - np.min(disparity) ) / ( np.max(disparity) - np.min(disparity) )
    blur = cv2.GaussianBlur(map, (15, 15), 5)
    h, w = map.shape[:2]
    cv2.imshow("", blur)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
v.release()
cv2.destroyAllWindows()

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる