3
6

More than 3 years have passed since last update.

OpenCV を使ってお絵かきアプリを作る方法

Last updated at Posted at 2020-07-25

0.最初に

今回作るものがどういう感じで動くのか見てみたい方は、こちら(youtubeの動画)からどうぞ。

1.実装

opencv.py
import cv2
import numpy as np

drawing = False 
color = (255,255,255)
ix,iy = 0,0

def nothing(x):
    pass

def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,color

    b = cv2.getTrackbarPos('B','image')
    g = cv2.getTrackbarPos('G','image')
    r = cv2.getTrackbarPos('R','image')
    s = cv2.getTrackbarPos('Size','image')
    i = cv2.getTrackbarPos(switch,'image')

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
        if i == 1:
            b,g,r = 0,0,0
        if drawing == True:
            cv2.circle(img,(x,y),s,(b,g,r),-1)

    elif event == cv2.EVENT_LBUTTONUP:
        if i == 1:
            b,g,r = 0,0,0
        drawing = False
        cv2.circle(img,(x,y),s,(b,g,r),-1)

img = np.full((800,800,3),255,np.uint8)
cv2.namedWindow('image')

cv2.createTrackbar('B','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('Size', 'image',1,30,nothing)
cv2.setMouseCallback('image',draw_circle)
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image',0,1,nothing)

while True:  
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    cv2.imshow('image',img)
cv2.destroyAllWindows()

ここでは、色を変えるためのトラックバー3つとペンのサイズを変えるためのトラックバーを1つ、消しゴムとペンに切り替えるためのトラックバー1つを作っています。nothing()はコールバック関数でその名の通り何もしません。なのでマウスが押されたときに色のトラックバーの値を取得し、その位置に円を描きます。これが連続的に続くことによって線が描かれているように見えます。マウスが離れたらその位置まで円を描いて終了です。線がマウスに追いつかなかったり、マウスを速く動かしすぎると円が見えてしまいますがそこまで気になりませんでした。また、消しゴムは上から黒で塗りつぶしているだけです。

最後に

今回作ったものはYoutubeでも解説しているのでそちらも良かったらご覧ください。質問、アドバイスなどがございましたらぜひコメントしてください。

3
6
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
3
6