亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python openCV 基于TCP的socket網(wǎng)絡(luò)傳輸視頻(一)

系統(tǒng) 2478 0

create time:2019年7月17日

??我在網(wǎng)上找了好多,現(xiàn)在基本實(shí)現(xiàn)了傳輸視頻的功能,其思路是:首先得先了解如何使用openCV采集攝像頭數(shù)據(jù),
其次得了解python socket網(wǎng)絡(luò)編程。因?yàn)閟ocket不能直接傳輸openCV采集的數(shù)據(jù),所以還需要轉(zhuǎn)碼操作。
??在下個(gè)版本,我用的類的方式實(shí)現(xiàn)了視頻傳輸,這個(gè)版本先用平常方法實(shí)現(xiàn)的,也是一個(gè)客戶端,一個(gè)服務(wù)端。

服務(wù)端

            
              
                #!/usr/bin/python
              
              
                # -*-coding:utf-8 -*-
              
              
                import
              
               socket

              
                import
              
               cv2

              
                import
              
               numpy


              
                # 接受圖片大小的信息
              
              
                def
              
              
                recv_size
              
              
                (
              
              sock
              
                ,
              
               count
              
                )
              
              
                :
              
              
     buf 
              
                =
              
              
                ''
              
              
                while
              
               count
              
                :
              
              
         newbuf 
              
                =
              
               sock
              
                .
              
              recv
              
                (
              
              count
              
                )
              
              
                if
              
              
                not
              
               newbuf
              
                :
              
              
                return
              
              
                None
              
              
         buf 
              
                +=
              
               newbuf
         count 
              
                -=
              
              
                len
              
              
                (
              
              newbuf
              
                )
              
              
                return
              
               buf


              
                # socket.AF_INET 用于服務(wù)器與服務(wù)器之間的網(wǎng)絡(luò)通信
              
              
                #socket.SOCK_STREAM 代表基于TCP的流式socket通信
              
              
s 
              
                =
              
               socket
              
                .
              
              socket
              
                (
              
              socket
              
                .
              
              AF_INET
              
                ,
              
               socket
              
                .
              
              SOCK_STREAM
              
                )
              
              
                # 設(shè)置地址與端口,如果是接收任意ip對(duì)本服務(wù)器的連接,地址欄可空,但端口必須設(shè)置
              
              
address 
              
                =
              
              
                (
              
              
                '10.0.0.30'
              
              
                ,
              
              
                8010
              
              
                )
              
              
s
              
                .
              
              bind
              
                (
              
              address
              
                )
              
              
                # 將Socket(套接字)綁定到地址
              
              
s
              
                .
              
              listen
              
                (
              
              
                True
              
              
                )
              
              
                # 開始監(jiān)聽TCP傳入連接
              
              
                print
              
              
                (
              
              
                'Waiting for images...'
              
              
                )
              
              
                # 接受TCP鏈接并返回(conn, addr),其中conn是新的套接字對(duì)象,可以用來接收和發(fā)送數(shù)據(jù),addr是鏈接客戶端的地址。
              
              

conn
              
                ,
              
               addr 
              
                =
              
               s
              
                .
              
              accept
              
                (
              
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
     length 
              
                =
              
               recv_size
              
                (
              
              conn
              
                ,
              
              
                16
              
              
                )
              
              
                # 首先接收來自客戶端發(fā)送的大小信息
              
              
                if
              
              
                isinstance
              
              
                (
              
              length
              
                ,
              
              
                str
              
              
                )
              
              
                :
              
              
                # 若成功接收到大小信息,進(jìn)一步再接收整張圖片
              
              
         stringData 
              
                =
              
               recv_size
              
                (
              
              conn
              
                ,
              
              
                int
              
              
                (
              
              length
              
                )
              
              
                )
              
              
         data 
              
                =
              
              numpy
              
                .
              
              fromstring
              
                (
              
              stringData
              
                ,
              
               dtype
              
                =
              
              
                'uint8'
              
              
                )
              
              
         decimg 
              
                =
              
               cv2
              
                .
              
              imdecode
              
                (
              
              data
              
                ,
              
              
                1
              
              
                )
              
              
                # 解碼處理,返回mat圖片
              
              
         cv2
              
                .
              
              imshow
              
                (
              
              
                'SERVER'
              
              
                ,
              
               decimg
              
                )
              
              
                if
              
               cv2
              
                .
              
              waitKey
              
                (
              
              
                10
              
              
                )
              
              
                ==
              
              
                27
              
              
                :
              
              
                break
              
              
                print
              
              
                (
              
              
                'Image recieved successfully!'
              
              
                )
              
              
                if
              
               cv2
              
                .
              
              waitKey
              
                (
              
              
                10
              
              
                )
              
              
                ==
              
              
                27
              
              
                :
              
              
                break
              
              
s
              
                .
              
              close
              
                (
              
              
                )
              
              
cv2
              
                .
              
              destroyAllWindows
              
                (
              
              
                )
              
            
          

客戶端

            
              
                #!/usr/bin/python
              
              
                # -*-coding:utf-8 -*-
              
              
                import
              
               socket

              
                import
              
               cv2

              
                import
              
               numpy

              
                from
              
               time 
              
                import
              
               sleep


              
                # socket.AF_INET 用于服務(wù)器與服務(wù)器之間的網(wǎng)絡(luò)通信
              
              
                # socket.SOCK_STREAM 代表基于TCP的流式socket通信
              
              
sock 
              
                =
              
               socket
              
                .
              
              socket
              
                (
              
              socket
              
                .
              
              AF_INET
              
                ,
              
               socket
              
                .
              
              SOCK_STREAM
              
                )
              
              
                # 連接服務(wù)端
              
              
address_server 
              
                =
              
              
                (
              
              
                '10.0.0.30'
              
              
                ,
              
              
                8888
              
              
                )
              
              
sock
              
                .
              
              connect
              
                (
              
              address_server
              
                )
              
              
                # 從攝像頭采集圖像
              
              
                # 參數(shù)是0,表示打開筆記本的內(nèi)置攝像頭,參數(shù)是視頻文件路徑則打開視頻
              
              
capture 
              
                =
              
               cv2
              
                .
              
              VideoCapture
              
                (
              
              
                0
              
              
                )
              
              
                # capture.read() 按幀讀取視頻
              
              
                # ret,frame 是capture.read()方法的返回值
              
              
                # 其中ret是布爾值,如果讀取幀正確,返回True;如果文件讀到末尾,返回False。
              
              
                # frame 就是每一幀圖像,是個(gè)三維矩陣
              
              
ret
              
                ,
              
               frame 
              
                =
              
               capture
              
                .
              
              read
              
                (
              
              
                )
              
              
encode_param 
              
                =
              
              
                [
              
              
                int
              
              
                (
              
              cv2
              
                .
              
              IMWRITE_JPEG_QUALITY
              
                )
              
              
                ,
              
              
                50
              
              
                ]
              
              
                while
              
               ret
              
                :
              
              
                # 首先對(duì)圖片進(jìn)行編碼,因?yàn)閟ocket不支持直接發(fā)送圖片
              
              
                # '.jpg'表示把當(dāng)前圖片frame按照jpg格式編碼
              
              
                # result, img_encode = cv2.imencode('.jpg', frame)
              
              
    img_encode 
              
                =
              
               cv2
              
                .
              
              imencode
              
                (
              
              
                '.jpg'
              
              
                ,
              
               frame
              
                ,
              
               encode_param
              
                )
              
              
                [
              
              
                1
              
              
                ]
              
              
    data 
              
                =
              
               numpy
              
                .
              
              array
              
                (
              
              img_encode
              
                )
              
              
    stringData 
              
                =
              
               data
              
                .
              
              tostring
              
                (
              
              
                )
              
              
                # 首先發(fā)送圖片編碼后的長(zhǎng)度
              
              
    sock
              
                .
              
              send
              
                (
              
              
                str
              
              
                (
              
              
                len
              
              
                (
              
              stringData
              
                )
              
              
                )
              
              
                .
              
              ljust
              
                (
              
              
                16
              
              
                )
              
              
                )
              
              
                # 然后一個(gè)字節(jié)一個(gè)字節(jié)發(fā)送編碼的內(nèi)容
              
              
                # 如果是python對(duì)python那么可以一次性發(fā)送,如果發(fā)給c++的server則必須分開發(fā)因?yàn)榫幋a里面有字符串結(jié)束標(biāo)志位,c++會(huì)截?cái)?
              
              
                # for i in range(0, len(stringData)):
              
              
                #     sock.send(stringData[i])
              
              
    sock
              
                .
              
              send
              
                (
              
              stringData
              
                )
              
              
                # sleep(1)
              
              
    ret
              
                ,
              
               frame 
              
                =
              
               capture
              
                .
              
              read
              
                (
              
              
                )
              
              
    cv2
              
                .
              
              resize
              
                (
              
              frame
              
                ,
              
              
                (
              
              
                640
              
              
                ,
              
              
                480
              
              
                )
              
              
                )
              
              

sock
              
                .
              
              close
              
                (
              
              
                )
              
              
cv2
              
                .
              
              destroyAllWindows
              
                (
              
              
                )
              
            
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 四虎影视8848a四虎在线播放 | 国产精品你懂的在线播放 | 亚洲阿v天堂在线观看2017 | 久久国产国内精品对话对白 | 欧美一级午夜免费视频你懂的 | 国产精品久久精品牛牛影视 | 亚洲色图国产精品 | 日本一线一区二区三区免费视频 | free性欧美极度另类超级大 | 欧美日韩一区二区视频免费看 | 黄色在线免费观看网站 | 国产精品激情综合久久 | 91国内精品久久久久怡红院 | 久久美女精品 | 久久天天躁狠狠躁夜夜呲 | 宅男在线影院 | 国产亚洲精品久久yy5099 | 国产午夜不卡在线观看视频666 | 97理论三级九七午夜在线观看 | 日本爱爱网站 | 欧美亚洲另类色国产综合 | 日本中文字幕网站 | 91在线网| 久久99爱视频 | 成熟的女性强烈交性视频 | 欧美一级网址 | 国产乱人视频在线播放不卡 | 欧美国产亚洲精品a第一页 欧美国产亚洲精品高清不卡 | 天天爱天天操 | 国产久7精品视频 | 日本免费一区二区久久人人澡 | 国产精彩视频 | 中文字幕亚洲欧美一区 | 亚洲欧美在线中文字幕不卡 | 欧美日韩不卡在线 | 99久久免费精品国产免费 | 自拍偷自拍亚洲精品被多人伦好爽 | 一区二区三区在线观看视频 | 成人国产精品久久久免费 | 欧美69p| 亚洲精品第一区二区在线 |