・開発環境・

・windows10
・Anaconda(4.2.0)
・OpenCV(3.3.1)
・numpy(1.14.2)

サーバー側コード

server.py
import socket
import numpy as np
import cv2
import time


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#ソケットオブジェクト作成

s.bind(("XXX.XXX.X.X", XXXXX))    # サーバー側PCのipと使用するポート

print("接続待機中")  

s.listen(1)                     # 接続要求を待機

soc, addr = s.accept()          # 要求が来るまでブロック

print(str(addr)+"と接続完了")  

cam = cv2.VideoCapture(0)#カメラオブジェクト作成

while (True):

    flag,img = cam.read()       #カメラから画像データを受け取る

    img = img.tostring()        #numpy行列からバイトデータに変換

    soc.send(img)              # ソケットにデータを送信

    #time.sleep(0.5)            #フリーズするなら#を外す。

    k = cv2.waitKey(1)         #↖ 
    if k== 13 :                #← ENTERキーで終了
        break                  #↙

cam.releace()                  #カメラオブジェクト破棄

クライアント側コード

criant.py
import socket
import numpy as np
import cv2


soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#ソケットオブジェクト作成

soc.connect(("XXX.XXX.X.X", XXXXX))#サーバー側のipと使用するポート(ポートはサーバーと同じにする。)

print("接続完了")

while(1):
    data = soc.recv(921600)#引数は下記注意点参照

    data = np.fromstring(data,dtype=np.uint8)#バイトデータ→ndarray変換

   data = np.reshape(data,(480,640,3))#形状復元(これがないと一次元行列になってしまう。) reshapeの第二引数の(480,640,3)は引数は送られてくる画像の形状

    cv2.imshow("",data);



    k = cv2.waitKey(1)
    if k== 13 :
        break

cv2.destroyAllWindows() # 作成したウィンドウを破棄   

注意点

クライアント側のコード上にあるsoc.recv(921600)の引数は
受信するバイトデータのバイト数ですので
カメラから得られる画像データの形状が(480,640,3)で
ndarray型からbytes型に変換する段階で一次元行列に変換されるので
480*640*3=921600バイトとしました。

また、しようするpcのスペックによっては通信が不安定になるので
フリーズしたならサーバー側のコード内の#time.sleep(0.5)の#を
外してみてください。カク付きますが動くはずです。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.