Visual Studio CodeのPythonを利用したOpenCVプログラミング入門

Tweet


OpenCVプログラミング入門です.WindowsのVisual Studio Codeを使ったPythonプログラミングです.OpenCVプログラミングの基本を短時間で修得します.


IrfanViewのインストール


Anacondaのインストール


Anacondaで環境設定

ターミナルで以下のコマンドを実行する.

pip install --user --upgrade pip
pip install numpy
pip install opencv-python


Visual Studio Codeのインストール


Visual Studio CodeでPythonのインストール

拡張機能の検索欄にpythonと書く.Python(Microsoft)をインストールする.


Visual Studio Codeでプログラミング

左側のアイコンからエクスプローラーを選び,フォルダを開く.

エクスプローラーで右クリックして[新しいファイル]をクリックする.ファイル名を入力する.

左下の青いステータスバーをクリックする.[Select the workspace to set the interpreter]が出てきた場合,先程追加した作業用フォルダを選ぶ.[インタープリターを選択]で,先程Anacondaで作成した環境を選ぶ.

ソースコード編集エリアに以下のように書く.

import numpy
import cv2
print(numpy.__version__)
print(cv2.__version__)

右上の再生ボタンの[ターミナルでPythonファイルを実行]をクリックする.下部の[ターミナル]に実行結果が表示されたらOK.

行列計算のプログラミング

import numpy as np
def main():
    mata=np.zeros((2,2),dtype=np.float64)
    vecx=np.zeros((2,1),dtype=np.float64)
    mata[0,0]=1
    mata[0,1]=2
    mata[1,0]=3
    mata[1,1]=4
    vecx[0,0]=2
    vecx[1,0]=1
    vecb=mata@vecx
    print('a=',mata)
    print('x=',vecx)
    print('b=',vecb)
if __name__=='__main__':
    main()


お絵かきプログラミング

import numpy as np
import cv2
def main():
    img=np.zeros((480,640,3),dtype=np.uint8)
    cv2.line(img,(100,100),(200,100),(0,0,255))
    cv2.rectangle(img,(100,200),(200,300),(0,255,0))
    cv2.circle(img,(400,200),50,(255,0,0))
    cv2.imshow('opencv program',img)
    cv2.waitKey()
    cv2.destroyAllWindows()
if __name__=='__main__':
    main()


画像処理プログラミングの基本的な骨組み

meal41.jpg

import numpy as np
import cv2
def main():
    input=cv2.imread('meal41.jpg',cv2.IMREAD_COLOR)
    if input is None:
        print('Cannot open file')
        return
    rows,cols,_=input.shape
    output=input.copy()
    for y in range(0,rows):
        for x in range(0,cols):
            r=input[y,x,2]
            g=input[y,x,1]
            b=input[y,x,0]
            output[y,x,2]=0.9*r
            output[y,x,1]=0.7*g
            output[y,x,0]=0.4*b
    cv2.imwrite('output.bmp',output)
if __name__=='__main__':
    main()


近傍画素を使った画像処理プログラミング

grayscale.jpg

import numpy as np
import cv2
def main():
    input=cv2.imread('grayscale.jpg',cv2.IMREAD_GRAYSCALE)
    if input is None:
        print('Cannot open file')
        return
    rows,cols=input.shape
    output=input.copy()
    for y in range(0,rows):
        for x in range(0,cols):
            num=0
            val=0
            for yy in [y-1,y,y+1]:
                for xx in [x-1,x,x+1]:
                    if 0<=xx<cols and 0<=yy<rows:
                        val+=input[yy,xx]
                        num+=1
            output[y,x]=val/num
    cv2.imwrite('output.bmp',output)
if __name__=='__main__':
    main()


照度差ステレオ法の実装例

input0.bmp
input1.bmp
input2.bmp

inside.byte
Normal2Height.exe

import numpy as np
import cv2
def main():
    input=[]
    input.append(cv2.imread('input0.bmp',cv2.IMREAD_GRAYSCALE))
    input.append(cv2.imread('input1.bmp',cv2.IMREAD_GRAYSCALE))
    input.append(cv2.imread('input2.bmp',cv2.IMREAD_GRAYSCALE))
    if input[0] is None or input[1] is None or input[2] is None:
        print('Cannot open file')
        return
    rows,cols=input[0].shape
    matl=np.zeros((3,3),dtype=np.float64)
    matl[0,0]=1.58546E-17
    matl[0,1]=0.258819045
    matl[0,2]=0.965925826
    matl[1,0]=-0.353553391
    matl[1,1]=-0.353553391
    matl[1,2]=0.866025404
    matl[2,0]=0.353553391
    matl[2,1]=-0.353553391
    matl[2,2]=0.866025404
    invl=np.linalg.inv(matl)
    output=np.zeros((rows,cols,3),dtype=np.float32)
    for y in range(0,rows):
        for x in range(0,cols):
            veci=np.zeros((3,1),dtype=np.float64)
            veci[0,0]=input[0][y,x]
            veci[1,0]=input[1][y,x]
            veci[2,0]=input[2][y,x]
            vecn=invl@veci
            r=np.linalg.norm(vecn)
            if r>1e-15:
                vecn/=r
            output[y,x,0]=vecn[0,0]
            output[y,x,1]=vecn[1,0]
            output[y,x,2]=vecn[2,0]
    with open('normal.float',mode='wb') as f:
        output.astype(np.float32).tofile(f)
if __name__=='__main__':
    main()


カメラキャリブレーションの実装例

image1.jpg
image2.jpg

import numpy as np
import cv2
def main():
    input=[]
    input.append(cv2.imread('image1.jpg',cv2.IMREAD_COLOR))
    input.append(cv2.imread('image2.jpg',cv2.IMREAD_COLOR))
    if input[0] is None or input[1] is None:
        print('Cannot open file')
        return
    output=[input[0].copy(),input[1].copy()]
    rows,cols,_=input[0].shape
    list3d=[]
    list2d=[]
    item3d=[]
    item2d=[]
    item3d.append([1,0,0])
    item2d.append([234,306])
    item3d.append([0,1,0])
    item2d.append([448,265])
    item3d.append([0,0,1])
    item2d.append([320,90])
    item3d.append([1,1,0])
    item2d.append([391,370])
    item3d.append([0,1,1])
    item2d.append([475,121])
    item3d.append([1,0,1])
    item2d.append([225,147])
    item3d.append([1,1,1])
    item2d.append([413,196])
    list3d.append(item3d)
    list2d.append(item2d)
    item3d=[]
    item2d=[]
    item3d.append([1,0,0])
    item2d.append([174,249])
    item3d.append([0,1,0])
    item2d.append([384,276])
    item3d.append([0,0,1])
    item2d.append([298,69])
    item3d.append([1,1,0])
    item2d.append([244,359])
    item3d.append([0,1,1])
    item2d.append([404,154])
    item3d.append([1,0,1])
    item2d.append([138,125])
    item3d.append([1,1,1])
    item2d.append([226,239])
    list3d.append(item3d)
    list2d.append(item2d)
    list3d=np.array(list3d,dtype=np.float32)
    list2d=np.array(list2d,dtype=np.float32)
    intrinsic=np.array([
        [1000,0,cols/2],
        [0,1000,rows/2],
        [0,0,1]
        ],dtype=np.float64)
    dist=np.zeros((1,4),dtype=np.float64)
    _,intrinsic,dist,vecr,vect=cv2.calibrateCamera(
    list3d,list2d,(cols,rows),intrinsic,dist,
    flags=
    cv2.CALIB_USE_INTRINSIC_GUESS|
    cv2.CALIB_FIX_PRINCIPAL_POINT|
    cv2.CALIB_FIX_ASPECT_RATIO|
    cv2.CALIB_ZERO_TANGENT_DIST|
    cv2.CALIB_FIX_K1|
    cv2.CALIB_FIX_K2|
    cv2.CALIB_FIX_K3|
    cv2.CALIB_FIX_K4|
    cv2.CALIB_FIX_K5|
    cv2.CALIB_FIX_K6)
    print('カメラ内部行列')
    print(intrinsic)
    print('平行移動ベクトル')
    print(vect[0])
    print(vect[1])
    print('回転行列')
    matr=[cv2.Rodrigues(vecr[0])[0],cv2.Rodrigues(vecr[1])[0]]
    print(matr[0])
    print(matr[1])
    for c in range(0,2):
        for i in [-1,0,1,2]:
            point=[]
            point.append(np.array([[-1],[i],[0]],dtype=np.float64))
            point.append(np.array([[2],[i],[0]],dtype=np.float64))
            point.append(np.array([[i],[-1],[0]],dtype=np.float64))
            point.append(np.array([[i],[2],[0]],dtype=np.float64))
            point=[intrinsic@(matr[c]@p+vect[c]) for p in point]
            point=[[int(p[0,0]/p[2,0]),int(p[1,0]/p[2,0])] for p in point]
            cv2.line(output[c],point[0],point[1],(0,0,255),
            thickness=3,lineType=cv2.LINE_AA)
            cv2.line(output[c],point[2],point[3],(0,0,255),
            thickness=3,lineType=cv2.LINE_AA)
    cv2.imwrite('output1.jpg',output[0])
    cv2.imwrite('output2.jpg',output[1])
if __name__=='__main__':
    main()


VS Codeの拡張機能

VS CodeでPythonプログラミングをする際にインストールしたほうがいいお勧めの拡張機能を紹介します.


もどる