Note

~/.jupyter/jupyter_notebook_config.py にて、"c.NotebookApp.iopub_data_rate_limit" 変更

以下の警告対応:

[W 02:19:13.975 NotebookApp] IOPub data rate exceeded. The notebook server will temporarily stop sending output to the client in order to avoid crashing it. To change this limit, set the config variable --NotebookApp.iopub_data_rate_limit. [W 02:19:14.464 NotebookApp] iopub messages resumed


In [14]:
# Motion JPEG Display
# 1. magic command
%matplotlib inline

# 2. import libs
import cv2
from matplotlib import pyplot as plt
import urllib
import numpy as np
## インライン表示
from IPython import display

In [23]:
# cap=cv2.VideoCapture('http://128.255.26.210/axis-cgi/mjpg/video.cgi?resolution=352x240')
# https://stackoverflow.com/questions/21702477/how-to-parse-mjpeg-http-stream-from-ip-camera
# mjpgSource=urllib.request.urlopen('http://128.255.26.210/axis-cgi/mjpg/video.cgi?resolution=352x240')
mjpgSource=urllib.request.urlopen('http://192.168.1.233:8080/stream/video.mjpeg')
mjpgBytes = bytes()
isFirstDone=False
mjpgPreview=None

try: 
    while(True):
        # Capture frame-by-frame. ffd8 is start,ffd9 is end of JPEG image.
        # 現時点の受信済バッファ内最後の Frame を処理対象にする。
        mjpgBytes+=mjpgSource.read(512)
        a = mjpgBytes.find(b'\xff\xd8') # ストリーム中の JPEG 画像データ先頭
        b = mjpgBytes.find(b'\xff\xd9') # ストリーム中の JPEG 画像データ末尾
            
        if a!=-1 and b!=-1:
            jpg = mjpgBytes[a:b+2]
            tmpBuf = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
            i=cv2.cvtColor(tmpBuf, cv2.COLOR_BGR2RGB)
            # TopView
            # Part1: Get Transform matrix
            im_height, im_width = i.shape[:2]
            print("w:{0},h:{1}".format(im_width,im_height))

            # これは実測値からの大体の値。4cmx4cmの正方形を写した画像。
            # ここは本来一度計算すればいいが、今回はこのループに入れたままにする。
            T_L=(168,260)
            T_R=(344,260)
            B_R=(408,360)
            B_L=(72,360)
            
            # これを変形する行列を求める
            # まずカメラでとらえた正方形の4点の座標。
            corners = np.array([T_L, T_R, B_R, B_L], dtype="float32")
            # とりあえず、600x800 の画像に Transform することにする。
            # 縦横比は正方形ということで1.0、計算省略
            maxWidth, maxHeight = 600, 800
            # Transform 後の正方形の中心は、
            # x は480//2=240
            # y は元の絵の Bottom 328 は、下から32 pix。
            # また、画面上の正方形の最大幅(下辺)が230であることから、
            # 480-32-115=333 とする
            center_x=maxWidth//2
            center_y=maxHeight-(im_height-L_B[1])-(R_B[0] - L_B[0])//2
            # trScale は変形後の正方形の1辺の長さの半分、やはり1辺230ということで230に。
            trScale=(R_B[0] - L_B[0])//2

            dst = np.array([
            [center_x - trScale, center_y - trScale], #top left
            [center_x + trScale, center_y - trScale], #top right
            [center_x + trScale, center_y + trScale], #bottom right
            [center_x - trScale, center_y + trScale], #bottom left
            ], dtype = "float32")            
            
            # 変換マトリクスの取得
            M = cv2.getPerspectiveTransform(corners, dst)
            
            # Part2: Get Canny Image
            # Part2: Cut upper half of image then get gray
            # half_img=i[im_height//2:im_height,0:im_width]
            # gray=cv2.cvtColor(half_img, cv2.COLOR_BGR2GRAY)
            gray=cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
            edges=cv2.Canny(gray,15,25)
            
            # Part3: Apply
            warped =  cv2.warpPerspective(edges, M, (maxWidth, maxHeight))
            
            i_display=warped
            
            # Display
            if not isFirstDone:
                # 最初のフレーム処理
                mjpgPreview=plt.imshow(i_display)
                isFirstDone=True
            else:
                # 2フレーム目以降のフレーム処理
                mjpgPreview.set_data(i_display)
                plt.draw()
                display.clear_output(wait=True)
                display.display(plt.gcf())

            # 処理済のデータを捨てます(frame)
            mjpgBytes= mjpgBytes[b+2:]

# Video を止めるには、"Kernel"|"Interrupt"
except KeyboardInterrupt: 
    mjpgSource.close()
    pass



In [13]:
L_B=(80,328)
L_B[1]


Out[13]:
328

In [ ]: