山内セミナー(2018/11/14)

関連サイトと資料

講義中に試したプログラム

test1.py
import numpy as np
import cv2
import math
	
base = 240    
width = base * 3
height = base * 2
r = int((height * 3 / 5) / 2)
	
print(width, height, r)
	
# イメージ生成
img = np.zeros((height, width, 3), np.uint8)
    
# 処理
cx = width/2
cy = height/2
for y in range(height):
    for x in range(width):
        dx = x - cx
        dy = y - cy
        if math.sqrt(dx * dx + dy * dy) <= r:
            img[y, x] = [0, 0, 255]
        else:
            img[y, x] = [255, 255, 255]
    
# ファイルに保存
cv2.imwrite('JapanFlag.png', img)
    
# 表示
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

test2.py
import cv2
    
# 画像の読み込み
img = cv2.imread('JapanFlag.png', cv2.IMREAD_UNCHANGED)
    
height, width, _ = img.shape
    
count = 0
for y in range(height):
    for x in range(width):
        if img[y,x,0] == 0 and img[y,x,1] == 0 and img[y,x,2] == 255:
            count += 1 # count = count + 1
    
print('全{0}ピクセル中、赤いピクセルは{1}ピクセルでした!'.format(width * height, count))

test3.py
import cv2
    
cap = cv2.VideoCapture(0)
    
while(True):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
cap.release()
cv2.destroyAllWindows()

test4.py
import cv2
    
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
    ret, frame = cap.read()
    if not ret:
        break
    
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
cap.release()
cv2.destroyAllWindows()

test5.py
import cv2
    
cap = cv2.VideoCapture(0)
    
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('output.m4v', fourcc, 20.0, (640,480))
    
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        out.write(frame)
        cv2.imshow('frame',frame)
    
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
    
cap.release()
out.release()
cv2.destroyAllWindows()

既存画像の読み込みと各ピクセルへのアクセス

以下のプログラムを実際に動かしてみよう。

既存画像の読み込み1.py
import cv2
	
# 画像の読み込み
img = cv2.imread('JapanFlag.png', cv2.IMREAD_UNCHANGED)
	
height, width, c = img.shape
	
print('width = {0}, height = {1}, c = {2}'.format(width, height, c))

JapanFlag.png

この結果を使って、画像の各ピクセルにアクセスして赤色のピクセル数を数えてみる。

既存画像の読み込み2.py
import cv2
	
# 画像の読み込み
img = cv2.imread('JapanFlag.png', cv2.IMREAD_UNCHANGED)
	
height, width, c = img.shape
	
count = 0
for y in range(height):
	for x in range(width):
		if img[y,x,0] == 0 and img[y,x,1] == 0 and img[y,x,2] == 255:
			count += 1
	
print('全{0}ピクセル中、赤いピクセルは{1}ピクセルでした!'.format(width * height, count))

カメラからの動画取り込み

以下のプログラムを実際に動かしてみよう。

カメラからの動画取り込み1.py
import cv2
	
cap = cv2.VideoCapture(0)
	
while(True):
	ret, frame = cap.read()
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
	cv2.imshow('frame',gray)

	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
	
cap.release()
cv2.destroyAllWindows()

ファイルからの動画再生

ファイルからの動画再生1.py
import cv2
	
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
	ret, frame = cap.read()
	if not ret:
		break
	
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
	cv2.imshow('frame',gray)
	
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
	
cap.release()
cv2.destroyAllWindows()
処理対象のファイルはこちらからダウンロードしてください。

動画の保存

動画の保存1.py
import cv2
	
cap = cv2.VideoCapture(0)
	
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('output.m4v', fourcc, 20.0, (640,480))
	
while(cap.isOpened()):
	ret, frame = cap.read()
	if ret == True:
		out.write(frame)
		cv2.imshow('frame',frame)
	
		if cv2.waitKey(1) & 0xFF == ord('q'):
			break
	else:
		break
	
cap.release()
out.release()
cv2.destroyAllWindows()

直線を描画する

直線を描画する1.py
import numpy as np
import cv2
	
img = np.zeros((512, 512, 3), np.uint8)
	
cv2.line(img, (0,0), (511,511), (255,0,0), 5)
	
cv2.imshow('sample', img)
	
cv2.waitKey(0)
cv2.destroyAllWindows()

四角形を描画する

四角形を描画する1.py
import numpy as np
import cv2
	
img = np.zeros((512, 512, 3), np.uint8)
	
cv2.rectangle(img, (384,0), (510,128), (0,255,0), 3)
	
cv2.imshow('sample', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

円を描画する

円を描画する1.py
import numpy as np
import cv2
	
img = np.zeros((512, 512, 3), np.uint8)
	
cv2.circle(img, (447,63), 63, (0,0,255), -1)
	
cv2.imshow('sample', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

楕円を描画する

楕円を描画する1.py
import numpy as np
import cv2
	
img = np.zeros((512, 512, 3), np.uint8)
	
cv2.ellipse(img, (256,256), (100,50), 0, 0, 180, 255, -1)
	
cv2.imshow('sample', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

多角形を描画する

多角形を描画する1.py
import numpy as np
import cv2
	
img = np.zeros((512, 512, 3), np.uint8)
	
pts = np.array([[10,5], [20,30], [70,20], [50,10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0,255,255))
	
cv2.imshow('sample', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

文字列を描画する

文字列を描画する1.py
import numpy as np
import cv2
	
img = np.zeros((512, 512, 3), np.uint8)
	
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV', (10,500), font, 4, (255,255,255), 2, cv2.LINE_AA)
	
cv2.imshow('sample', img)
cv2.waitKey(0)
cv2.destroyAllWindows()