16日目(1/2)

【課題7】画像から顔を検出しよう

■プレビュー

検出あり

 

検出なし

■ソースコード(face_detection.py)


import sys
import cv2

if len(sys.argv)<2:
    print('表示したいファイル名を指定してください。')
    sys.exit()

file = sys.argv[1]

try:
    img = cv2.imread(file)

    if img is None:
        raise ValueError('ファイルが見つかりません。')

    RESIZE_WIDTH = 800

    img_height = img.shape[0]
    img_width = img.shape[1]

    if img_width > RESIZE_WIDTH:
        img_resize = cv2.resize(img, (RESIZE_WIDTH, int(RESIZE_WIDTH / img_width * img_height)))
    else:
        img_resize = img
    
    img_gray = cv2.cvtColor(img_resize, cv2.COLOR_RGB2GRAY)

    CASCADE_FILE = 'haarcascade_frontalface_alt.xml'
    #CASCADE_FILE = 'haarcascade_eye.xml'

    haar_cascade = cv2.CascadeClassifier(CASCADE_FILE)
    detection = haar_cascade.detectMultiScale(img_resize, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))
    
    if len(detection) > 0:
        for rect in detection:
            cv2.rectangle(img_resize, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0, 255), thickness=2)
    else:
        cv2.putText(img_resize, 'no match found', (20, 50), cv2.FONT_HERSHEY_COMPLEX, 1.0, (0, 0, 255), 2)

    cv2.imshow(file, img_resize)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
except ValueError as e:
    print(e)
except:
    import traceback
    traceback.print_exc()

16日目(2/2)

【課題8】画像から目を検出しよう

■プレビュー

■ソースコード(face_detection.py)


import sys
import cv2

if len(sys.argv)<2:
    print('表示したいファイル名を指定してください。')
    sys.exit()

file = sys.argv[1]

try:
    img = cv2.imread(file)

    if img is None:
        raise ValueError('ファイルが見つかりません。')

    RESIZE_WIDTH = 800

    img_height = img.shape[0]
    img_width = img.shape[1]

    if img_width > RESIZE_WIDTH:
        img_resize = cv2.resize(img, (RESIZE_WIDTH, int(RESIZE_WIDTH / img_width * img_height)))
    else:
        img_resize = img
    
    img_gray = cv2.cvtColor(img_resize, cv2.COLOR_RGB2GRAY)

    #CASCADE_FILE = 'haarcascade_frontalface_alt.xml'
    CASCADE_FILE = 'haarcascade_eye.xml'

    haar_cascade = cv2.CascadeClassifier(CASCADE_FILE)
    detection = haar_cascade.detectMultiScale(img_resize, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))
    
    if len(detection) > 0:
        for rect in detection:
            cv2.rectangle(img_resize, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0, 255), thickness=2)
    else:
        cv2.putText(img_resize, 'no match found', (20, 50), cv2.FONT_HERSHEY_COMPLEX, 1.0, (0, 0, 255), 2)

    cv2.imshow(file, img_resize)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
except ValueError as e:
    print(e)
except:
    import traceback
    traceback.print_exc()

17日目(1/1)

【課題9】2つの画像から一致する部分検出しよう

■プレビュー

1つ目の結果

 

2つ目の結果

■ソースコード(template_matching.py)


import sys
import cv2

if len(sys.argv)<3:
    print('検索対象画像ファイルとテンプレート画像ファイルの2つ指定してください。')
    sys.exit()

file = sys.argv[1]
file_templ = sys.argv[2]

try:
    img = cv2.imread(file)
    img_template = cv2.imread(file_templ)

    if (img is None) or (img_template is None):
        raise ValueError('検索ファイルが見つかりません。')

    result_match = cv2.matchTemplate(img, img_template, cv2.TM_CCOEFF_NORMED)

    cv2.imshow('Template Matching', result_match)
    cv2.waitKey(0)

    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result_match)
    
    top_left = max_loc
    bottom_right = (top_left[0] + img_template.shape[1], top_left[1] + img_template.shape[0])

    cv2.rectangle(img, top_left, bottom_right, (0, 0, 255), 2)

    cv2.imshow(file, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
except ValueError as e:
    print(e)
except:
    import traceback
    traceback.print_exc()

18日目(1/1)

【課題10】2つの画像の特徴点で一致具合を見てみよう

■プレビュー

1つ目の結果

 

2つ目の結果

 

3つ目の結果

 

■ソースコード(feature_matching.py)


import sys
import cv2

if len(sys.argv)<3:
    print('特徴量検出するファイルを2つ指定してください。')
    sys.exit()

file1 = sys.argv[1]
file2 = sys.argv[2]

try:
    img1 = cv2.imread(file1)
    img2 = cv2.imread(file2)

    if (img1 is None) or (img2 is None):
        raise ValueError('特徴量検出ファイルが見つかりません。')

    detector = cv2.AKAZE_create()
    
    point1, desc1 = detector.detectAndCompute(img1, None)
    point2, desc2 = detector.detectAndCompute(img2, None)

    matcher = cv2.BFMatcher(cv2.NORM_HAMMING, True)
    matches = matcher.match(desc1, desc2)
    
    img_match = cv2.drawMatches(img1, point1, img2, point2, matches, None, flags=2)

    cv2.imshow(file1+'<-->'+file2, img_match)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
except ValueError as e:
    print(e)
except:
    import traceback
    traceback.print_exc()