63076


OpenCV・Pythonを使用し、下記のようなプログラムを作りたいと考えています。  
・撮影した物体の最外部の輪郭を検出し、物体の輪郭付近に文字を表示させる

困っていること  
・cv2.RETR_EXTERNALを使用すると、画像自体の枠を捉えてしまい、文字が画像の枠付近に表示されてしまいます。

下記仕様・ソースコードです。  
python3.7  
Opencv4.1.2  
windows10 Home 64bit  
USB接続Webカメラ使用

[code]

    import cv2
    import numpy as np
    
    blue_min = np.array([100, 100, 100], np.uint8)
    blue_max = np.array([170, 200, 255], np.uint8)
    
    try:
        capture = cv2.VideoCapture(1)
    
    while(True):
            ret, frame = capture.read()
            if ret == False:
                print('カメラから映像を取得できませんでした。')
                break
    
            dst = cv2.inRange(frame, blue_min, blue_max)
            dst = cv2.bitwise_not(dst)
            dst = cv2.medianBlur(dst, 3)
            contours, _  = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
            cnt = contours[0]
            leftmost = cnt[cnt[:,:,0].argmin()][0][0]
            topmost = cnt[cnt[:,:,1].argmin()][0][1]
            cv2.putText(dst, "mobile", (leftmost , topmost ), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 3, cv2.LINE_4,bottomLeftOrigin = False)
            cv2.imshow('f', dst)
    
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    
        capture.release()
        cv2.destroyAllWindows()
    
    except:
        import sys
        print("Error:", sys.exc_info()[0])
        print(sys.exc_info()[1])
        import traceback
        print(traceback.format_tb(sys.exc_info()[2]))
    
[/code]

試した事  
・bitwise_notを使用して画像を反転する、または反転しないコードでテストを行いましたが、結果は同じでした。下記参考にした質問です。  
[How to avoid detecting image frame when using
findContours](https://stackoverflow.com/questions/29329866/how-to-avoid-
detecting-image-frame-when-using-findcontours)

下記テスト結果の画像です。  
テストで検出する物体はスマートフォンで、表示する文字列は"mobile"です。

[![A:未加工の画像です](https://i.stack.imgur.com/dtPol.jpg)](https://i.stack.imgur.com/dtPol.jpg)  
[![B:テスト結果画像です](https://i.stack.imgur.com/eypd6.jpg)](https://i.stack.imgur.com/eypd6.jpg)

スマートフォンの近くに文字を表示させたいところ、写真Bの通り画像左下の枠の上に表示されてしまいます。

当方プログラミング自体初心者のため初歩的なミスが原因かと思いますが解決策が見つからず、  
教えて頂けると大変助かります。よろしくお願いいたします。


CC BY-SA 4.0
2020-02-14T11:10:13.437
63049
2020-02-15T15:22:11.107
37836
question
python opencv 画像
OpenCVで画像自体の枠を検出してしまう事を避ける為にはどうすれば良いでしょうか？


カメラ画像下の黒枠部分を検出してしまっているのではないでしょうか？  
どの部分を検出しているのか、一度確認してみることをお勧めします。  
下記のページが参考になりそうです。  
<https://www.pynote.info/entry/opencv-findcontours>

また、もし可能であれば上下の黒帯部分を処理エリアから外すのはいかがでしょう？  
カメラ解像度が640x480pixelとして、16行目に追加で  
dst = frame[100:440, 10:630] <\--追加  
dst = cv2.inRange(dst, blue_min, blue_max)  
のような感じにすると、上下の黒枠がなくなります。


CC BY-SA 4.0
2020-02-15T15:22:11.107
63076
2020-02-15T15:22:11.107
37845
63049
answer