GVKun编程网logo

在python opencv中通过网络发送实时视频帧(python opencv视频流)

6

在这里,我们将给大家分享关于在pythonopencv中通过网络发送实时视频帧的知识,让您更了解pythonopencv视频流的本质,同时也会涉及到如何更有效地opencv+python视频实时质心显

在这里,我们将给大家分享关于在python opencv中通过网络发送实时视频帧的知识,让您更了解python opencv视频流的本质,同时也会涉及到如何更有效地opencv+python视频实时质心显示、OpenCV-Python OpenCV中的K-Means聚类 | 五十八、OpenCV-Python 视频读取、opencv-python与c++ opencv中的一些区别和基础的知识的内容。

本文目录一览:

在python opencv中通过网络发送实时视频帧(python opencv视频流)

在python opencv中通过网络发送实时视频帧(python opencv视频流)

我正在尝试将用相机捕获的实时视频帧发送到服务器并进行处理。我使用usig opencv进行图像处理,使用python进行语言处理。这是我的代码

client_cv.py

import cv2import numpy as npimport socketimport sysimport picklecap=cv2.VideoCapture(0)clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect((''localhost'',8089))while True:    ret,frame=cap.read()    print sys.getsizeof(frame)    print frame    clientsocket.send(pickle.dumps(frame))

server_cv.py

import socketimport sysimport cv2import pickleimport numpy as npHOST=''''PORT=8089s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)print ''Socket created''s.bind((HOST,PORT))print ''Socket bind complete''s.listen(10)print ''Socket now listening''conn,addr=s.accept()while True:    data=conn.recv(80)    print sys.getsizeof(data)    frame=pickle.loads(data)    print frame    cv2.imshow(''frame'',frame)

这段代码给了我文件结尾错误,这是合乎逻辑的,因为数据总是不断到达服务器,而pickle不知道何时完成。我在互联网上进行的搜索使我使用了泡菜,但到目前为止还不能用。

注意 :我设置conn.recv为80,因为那是我说时得到的数字print sys.getsizeof(frame)

答案1

小编典典

几样东西:

  • 使用sendall而不是send因为您不能保证一切都将一口气发送
  • pickle 可以进行数据序列化,但是您必须为在客户端和服务器之间交换的消息建立自己的协议,这样您可以提前知道要读取的数据量以进行拆箱(请参阅下文)
  • 因为recv如果收到大块,您将获得更好的性能,因此将80替换为4096甚至更多
  • 当心sys.getsizeof:它返回内存中对象的大小,该大小与通过网络发送的字节的大小(长度)不同;对于Python字符串,两个值根本不相同
  • 请注意您要发送的帧的大小。下面的代码支持最大65535的框架。如果框架较大,请将“ H”更改为“ L”。

协议示例:

client_cv.py

import cv2import numpy as npimport socketimport sysimport pickleimport struct ### new codecap=cv2.VideoCapture(0)clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect((''localhost'',8089))while True:    ret,frame=cap.read()    data = pickle.dumps(frame) ### new code    clientsocket.sendall(struct.pack("H", len(data))+data) ### new code

server_cv.py

import socketimport sysimport cv2import pickleimport numpy as npimport struct ## newHOST=''''PORT=8089s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)print ''Socket created''s.bind((HOST,PORT))print ''Socket bind complete''s.listen(10)print ''Socket now listening''conn,addr=s.accept()### newdata = ""payload_size = struct.calcsize("H") while True:    while len(data) < payload_size:        data += conn.recv(4096)    packed_msg_size = data[:payload_size]    data = data[payload_size:]    msg_size = struct.unpack("H", packed_msg_size)[0]    while len(data) < msg_size:        data += conn.recv(4096)    frame_data = data[:msg_size]    data = data[msg_size:]    ###    frame=pickle.loads(frame_data)    print frame    cv2.imshow(''frame'',frame)

您可能可以对所有这些进行很多优化(减少复制,使用缓冲区接口等),但至少您可以理解。

opencv+python视频实时质心显示

opencv+python视频实时质心显示

利用opencv+python实现以下功能:

1)获取实时视频,分解帧频;

2)将视频做二值化处理;

3) 将视频做滤波处理(去除噪点,获取准确轮廓个数);

4)识别图像轮廓;

5)计算质心;

6)描绘质心动态变化曲线;

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 24 12:10:23 2018

@author: irene
"""

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import spline  
import math as mt
import cv2

cap = cv2.VideoCapture(''1.avi'')  #读入视频
c=1
plt.figure(figsize=(8,8),dpi=80) 
aa =[]
bb =[]
cc =[]
#uing = np.logspace(-3,2,121)
while(cap.isOpened()):  
    ret, frame = cap.read() 
    #分解为一帧一帧图像
    if ret == True: 
        #cv2.imshow("frame",image) 
        img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #彩色转灰度  
       # print(frame)    
        ret,thresh= cv2.threshold(img,127,255,0)   #二值化  
        image,contours,hierarchy = cv2.findContours(thresh, 3, 1)  
        img = cv2.medianBlur(image,5) #进行中值滤波

        cnt = contours[1]   #选取其中的第一个轮廓,这幅图像只有两个轮廓
        M = cv2.moments(cnt)  
        cX=int(M["m10"]/M["m00"])   #计算质心
        cY=int(M["m01"]/M["m00"])
        
        cv2.drawContours(img,contours,-1,(0,255,0),2)
        cv2.circle(img,(cX,cY),7,(255,255,255),-1)
        cv2.putText(img,"",(cX-20,cY-20),
        cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),2) 
        
        cv2.imshow("img",img)
        cv2.imwrite(''img/''+str(c) + ''.jpg'',frame) #存储为图像  
        
       # for u in uing:
        aa.append(cX)
        bb.append(cY)
        cc.append(c)
       # plt.plot(c,cX,''k-'') 
        
        #plt.plot(c,cX,color=''red'',linewidth=2.5,line:'')
       # plt.plot(c,cX,''k^'') 
        #plt.plot(c,cY,''yo:'')
        c = c+1  
              
    else:
          break  
   # cv2.imshow(''frame'',gray)  #显示标记后的图像q
     
    if cv2.waitKey(1) & 0xFF == ord(''q''):  
         break  
    
cap.release()  
cv2.destroyAllWindows() 

c1=np.var(aa)
c2=np.var(bb)

c1_1=c1/720*2.3*mt.pi/180
c1_2=c2/512*2.3*mt.pi/180

print(c1_1)
print(c1_2)

plt.plot(cc,aa) 
plt.show()
plt.plot(cc,bb)
plt.show()

  

OpenCV-Python OpenCV中的K-Means聚类 | 五十八

OpenCV-Python OpenCV中的K-Means聚类 | 五十八

目标

  • 了解如何在OpenCV中使用cv.kmeans()函数进行数据聚类

理解参数

输入参数

  1. sample:它应该是np.float32数据类型,并且每个功能都应该放在单个列中。
  2. nclusters(K):结束条件所需的簇数
  3. criteria:这是迭代终止条件。满足此条件后,算法迭代将停止。实际上,它应该是3个参数的元组。它们是(type,max_iter,epsilon)
    a. 终止条件的类型。它具有3个标志,如下所示:

    • cv.TERM_CRITERIA_EPS-如果达到指定的精度epsilon,则停止算法迭代。
    • cv.TERM_CRITERIA_MAX_ITER-在指定的迭代次数max_iter之后停止算法。
    • cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER-当满足上述任何条件时,停止迭代。
b. max_iter-一个整数,指定最大迭代次数。
c. epsilon-要求的精度
  1. attempts:该标志用于指定使用不同的初始标签执行算法的次数。该算法返回产生最佳紧密度的标签。该紧凑性作为输出返回。
  2. flags:此标志用于指定初始中心的获取方式。通常,为此使用两个标志:cv.KMEANS_PP_CENTERScv.KMEANS_RANDOM_CENTERS

输出参数

  1. 紧凑度:它是每个点到其相应中心的平方距离的总和。
  2. 标签:这是标签数组(与上一篇文章中的“代码”相同),其中每个元素标记为“0”,“ 1” .....
  3. 中心:这是群集中心的阵列。

现在,我们将通过三个示例了解如何应用K-Means算法。

1. 单特征数据

考虑一下,你有一组仅具有一个特征(即一维)的数据。例如,我们可以解决我们的T恤问题,你只用身高来决定T恤的尺寸。因此,我们首先创建数据并将其绘制在Matplotlib中

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
x = np.random.randint(25,100,25)
y = np.random.randint(175,255,25)
z = np.hstack((x,y))
z = z.reshape((50,1))
z = np.float32(z)
plt.hist(z,256,[0,256]),plt.show()

因此,我们有了“ z”,它是一个大小为50的数组,值的范围是0到255。我将“z”重塑为列向量。
如果存在多个功能,它将更加有用。然后我制作了np.float32类型的数据。
我们得到以下图像:

现在我们应用KMeans函数。在此之前,我们需要指定标准。我的标准是,每当运行10次算法迭代或达到epsilon = 1.0的精度时,就停止算法并返回答案。

# 定义终止标准 = ( type, max_iter = 10 , epsilon = 1.0 )
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
# 设置标志
flags = cv.KMEANS_RANDOM_CENTERS
# 应用K均值
compactness,labels,centers = cv.kmeans(z,2,None,criteria,10,flags)

这为我们提供了紧凑性,标签和中心。在这种情况下,我得到的中心分别为60和207。标签的大小将与测试数据的大小相同,其中每个数据的质心都将标记为“ 0”,“ 1”,“ 2”等。现在,我们根据标签将数据分为不同的群集。

A = z[labels==0]
B = z[labels==1]

现在我们以红色绘制A,以蓝色绘制B,以黄色绘制其质心。

# 现在绘制用红色''A'',用蓝色绘制''B'',用黄色绘制中心
plt.hist(A,256,[0,256],color = ''r'')
plt.hist(B,256,[0,256],color = ''b'')
plt.hist(centers,32,[0,256],color = ''y'')
plt.show()

得到了以下结果:

2. 多特征数据

在前面的示例中,我们仅考虑了T恤问题的身高。在这里,我们将同时考虑身高和体重,即两个特征。
请记住,在以前的情况下,我们将数据制作为单个列向量。每个特征排列在一列中,而每一行对应于一个输入测试样本。
例如,在这种情况下,我们设置了一个大小为50x2的测试数据,即50人的身高和体重。第一列对应于全部50个人的身高,第二列对应于他们的体重。第一行包含两个元素,其中第一个是第一人称的身高,​​第二个是他的体重。类似地,剩余的行对应于其他人的身高和体重。查看下面的图片:

现在,我直接转到代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
X = np.random.randint(25,50,(25,2))
Y = np.random.randint(60,85,(25,2))
Z = np.vstack((X,Y))
# 将数据转换未 np.float32
Z = np.float32(Z)
# 定义停止标准,应用K均值
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
ret,label,center=cv.kmeans(Z,2,None,criteria,10,cv.KMEANS_RANDOM_CENTERS)
# 现在分离数据, Note the flatten()
A = Z[label.ravel()==0]
B = Z[label.ravel()==1]
# 绘制数据
plt.scatter(A[:,0],A[:,1])
plt.scatter(B[:,0],B[:,1],c = ''r'')
plt.scatter(center[:,0],center[:,1],s = 80,c = ''y'', marker = ''s'')
plt.xlabel(''Height''),plt.ylabel(''Weight'')
plt.show()

我们得到如下结果:

3.颜色量化

颜色量化是减少图像中颜色数量的过程。这样做的原因之一是减少内存。有时,某些设备可能会受到限制,因此只能产生有限数量的颜色。同样在那些情况下,执行颜色量化。在这里,我们使用k均值聚类进行颜色量化。

这里没有新内容要解释。有3个特征,例如R,G,B。因此,我们需要将图像重塑为Mx3大小的数组(M是图像中的像素数)。在聚类之后,我们将质心值(也是R,G,B)应用于所有像素,以使生成的图像具有指定数量的颜色。再一次,我们需要将其重塑为原始图像的形状。下面是代码:

import numpy as np
import cv2 as cv
img = cv.imread(''home.jpg'')
Z = img.reshape((-1,3))
# 将数据转化为np.float32
Z = np.float32(Z)
# 定义终止标准 聚类数并应用k均值
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv.kmeans(Z,K,None,criteria,10,cv.KMEANS_RANDOM_CENTERS)
# 现在将数据转化为uint8, 并绘制原图像
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))
cv.imshow(''res2'',res2)
cv.waitKey(0)
cv.destroyAllWindows()

我们可以看的K=8的结果

欢迎关注磐创AI博客站:
http://panchuang.net/

OpenCV中文官方文档:
http://woshicver.com/

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

OpenCV-Python 视频读取

OpenCV-Python 视频读取

 1 import numpy as np
 2 import cv2
 3 # 读取视频文件
 4 cap = cv2.VideoCapture(''./law.mp4'')
 5 # 或者电影每秒的帧数
 6 fps = cap.get(cv2.CAP_PROP_FPS)
 7 # 判断视频是否一直打开
 8 while (cap.isOpened()):
 9     success,frame = cap.read()
10     # 视频显示
11     cv2.imshow(''law'', frame)
12     # 设置窗口
13     cv2.resizeWindow(''law'', 512,288)
14     # 判断退出条件
15     if cv2.waitKey(int(1000//fps)) ==ord(''q''):
16         break
17 # 清除缓存退出
18 cv2.destroyAllWindows()

 

 

#  获取摄像头 :  只需要将读取视频的文件里的值换成 0 

 1 # 值为0表示调取摄像头
 2 cap = cv2.VideoCapture(0)
 3 
 4 while (cap.isOpened()):
 5     sucess,frame = cap.read()
 6     cv2.imshow(''capture'', frame)
 7     if cv2.waitKey(41) == ord(''q''):
 8         break
 9 # 关闭摄像头
10 cap.release()
11 cv2.destroyAllWindows()

 

  

opencv-python与c++ opencv中的一些区别和基础的知识

opencv-python与c++ opencv中的一些区别和基础的知识

使用opencv-python一段时间了,因为之前没有大量接触过c++下的opencv,在网上看c++的一些程序想改成python遇到了不少坑,正好在这里总结一下。

  • 1.opencv 中x,y,height, width,rows,cols 的关系(转自http://blog.csdn.net/ikerpeng/article/details/41846259)

    opencv中图像的x,y 坐标以及 height, width,rows,cols 他们的关系经常混淆。

    rows 其实就是行,一行一行也就是y 啦。height高度也就是y啦。

    cols  也就是列,一列一列也就是x啦。width宽度也就是x啦。   

  • 2.补充(以下均为原创):

  1. opencv python中的rows cols分别为img.shape[0](height)和img.shape[1](width)
  2. opencv c++中的图像对象访问像素可使用.at :cv::mat的成员函数: .at(int y, int x),可以用来存取图像中对应坐标为(x,y)的元素坐标。但是在使用它时要注意,在编译期必须要已知图像的数据类型.但在opencv-python中访问像素可直接使用例如img[x][y] 的方法进行实现

  原因:和opencv不同,目前opencv-python中的数组均为numpy array形式。

  • 3.函数上的应用的不同处

  在opencv-python中,有很多函数的应用方法都与opencv中不同,下面简单的分析一下最不同的地方

   1)python中使用cv2.方法名或变量名来调用方法/变量

   2)对于具有同样作用的函数的不同调用方法,例如

 

//c++
cvtColor(srcImg, binaryImg, COLOR_BGR2GRAY);

 

#python
binaryImg = cv2.cvtColor(srcImg,cv2.COLOR_BGR2GRAY)

    当然对于每个具体的函数的具体用法,可以自行上网搜索

   3)python中对于变量的类型是不需要声明的,所以将c++中代码修改为python时需要注意很多(缩进虽然很便于查看,但是还是感觉写{}的感觉很爽233)

   4)python中函数参数可以为array形式,所以c++ opencv中的很多类型都是不存在的,切记使用cv2.类型名()去使用,例如

//c++
circle(srcImg, Point(x, y), 3, Scalar(255, 0, 255), 2, 8, 0);
#python
cv2.circle(srcImg, (x, y), 3, (255, 100, 255), 1, 8, 0)

   其他的小坑估计还很多,多Google吧。

我们今天的关于在python opencv中通过网络发送实时视频帧python opencv视频流的分享已经告一段落,感谢您的关注,如果您想了解更多关于opencv+python视频实时质心显示、OpenCV-Python OpenCV中的K-Means聚类 | 五十八、OpenCV-Python 视频读取、opencv-python与c++ opencv中的一些区别和基础的知识的相关信息,请在本站查询。

本文标签: