2017-05-04 19 views
1

ウェブカメラからopencvを使用してフレームを取得し、プロットします。 私は私がいる奇妙な問題は、私は長方形のことですmatplotlibイメージのボックス領域を選択して拡大します

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

import cv2 

boxSize = 150 
enlargeBy = 3 

def getBoxCoordinates(cap, size): 
    width = cap.get(3) 
    height = cap.get(4) 
    x1 = int(width/2) - int(size/2) 
    y1 = int(height/2) - int(size/2) 
    x2 = int(width/2) + int(size/2) 
    y2 = int(height/2) + int(size/2) 

    return [(x1, y1), (x2, y2)] 

def getBox(cap, boxSize, frame, enlargeBy): 
    [(x1, y1), (x2, y2)] = getBoxCoordinates(cap, boxSize); 

    # Get pixels in box 
    box_img = frame[y1 + 1:y2, x1 + 1:x2] # +1 cuz it excludes initial pixel interval 
    return cv2.resize(box_img, None, fx=enlargeBy, fy=enlargeBy, 
         interpolation=cv2.INTER_LINEAR) # different interpolation methods 

cap = cv2.VideoCapture(0); 
ret, frame = cap.read() 

figWidth = 20 
figHeight = 8 
fig = plt.figure(figsize=(figWidth, figHeight)) 


enlarged = getBox(cap, boxSize, frame, enlargeBy) 
[(x1, y1), (x2, y2)] = getBoxCoordinates(cap, boxSize); 
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), lineType=1) 


video_plot = plt.subplot2grid((figHeight, figWidth), (0, 0), colspan=4, rowspan=4) 
video_plot.axis('off') 
video_plot.set_title("Camera feed") 
video = video_plot.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) 


box_plot = plt.subplot2grid((figHeight, figWidth), (0, 4), colspan=4, rowspan=4) 
box_plot.axis('off') 
box_plot.set_title("Box") 
box = box_plot.imshow(cv2.cvtColor(enlarged, cv2.COLOR_BGR2RGB)) #frame just to start 


def updatefig(i): 
    ret, frame = cap.read() 
    cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), lineType=1) 

    enlarged = getBox(cap, boxSize, frame, enlargeBy) 

    video.set_data(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) 
    box.set_data(cv2.cvtColor(enlarged, cv2.COLOR_BGR2RGB)) 

    return [video, box] 

ani = animation.FuncAnimation(fig, updatefig, interval=20, frames=200, blit=True) 

plt.tight_layout() 
plt.show() 


cv2.destroyAllWindows() 


plt.show() 

(補間によって拡大)プロットの中央に四角形を描画し、別のプロットに選択したエリアやショーを得ますフレーム上の描画が正しく表示されていません。1つまたは複数の辺しか表示されません。 図の寸法が変更されたときにこれが変化することに気付きました。私が変更された場合、それは、私だけ下と左側を示し、上記のコードで:

figWidth = 10 

その後、私は下、右、上からではなく、左を参照してください。

正確にこれを引き起こしている可能性があり、修正する方法はありません。

答えて

2

cv2.rectangleは、画像としてピクセルとして描画されます。今問題は、おそらく、あなたがimshowプロットを使ってスクリーン上に表示できる、より多くのピクセルを画像に持つことでしょう。例えば。 cv画像に1200ピクセルあり、この画像を300ピクセルに表示するにはmatplotlibが4つの実ピクセルを1スクリーンピクセルに補間する必要があり、表示する1ピクセルを失う確率は75%です。

明らかな解決策は、矩形の線を太くすることです。

cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), thickness=3) 

しかし、これは、同様のズーム・インピクチャーで長方形のラインを持っているsideeffectを持っています:

enter image description hereしたがって

、別のオプションは、上にmatplotlibので四角形を描画することであってもよいですimshowプロットのこの矩形は一度描画するだけでよいが、返されるリストの一部である必要がある。updatefig。説明のための

... 
video = video_plot.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) 
rectangle = plt.Rectangle((x1,y1), x2-x1, y2-y1, edgecolor="gold", fill=False) 
video_plot.add_patch(rectangle) 
... 

def updatefig(i): 
    ret, frame = cap.read() 
    enlarged = getBox(cap, boxSize, frame, enlargeBy) 
    video.set_data(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) 
    box.set_data(cv2.cvtColor(enlarged, cv2.COLOR_BGR2RGB)) 
    return [video, box, rectangle] 

enter image description here

+0

作品見事とTY – dtam

関連する問題