opencv-python 的常用api(一):
-
读取
-
图片 : imread,imwrite,imshow,waitKey,destroyAllWindows,destroyWindow
import cv2 import numpy img = cv2.imread("xxx.jpeg",cv2.IMREAD_COLOR) '''第二个参数是要告诉函数应该如何读取这幅图片。 cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略, 这是默认参数; cv2.IMREAD_GRAYSCALE:以灰度模式读入图像''' cv2.imshow("aaa",img) '''显示图像。窗口会自动调整为图像大小。第一 个参数是窗口的名字,其次才是我们的图像''' cv2.namedWindow('image', cv2.WINDOW_NORMAL) cv2.imshow("image",img) '''如果你想自己调整窗口大小,你可以先创建一个窗口,之后再加载图像, 使用到的函数是 cv2.namedWindow()。 默认值cv2.WINDOW_AUTOSIZE。 修改成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。''' cv2.waitKey(0) '''cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫 秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果 按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没 有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限 期的等待键盘输入。''' cv2.destroyAllWindows() '''可以轻易删除任何我们建立的窗口。如果 你想删除特定的窗口可以使用 cv2.destroyWindow("aaa"),参数为你想删 除的窗口名。'''
注意,如果使用plt展示的图片为彩色的,则需要转换一下,因为plt 使用的是RGB,而opencv使用的是BGR,使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 或者 img2 = img[…, ::-1]。
-
视频:VideoCapture(),VideoWrite()
cap = cv2.VideoCapture("rtsp://admin:admin@192.168.2.211") '''参数可以是0:笔记本摄像头;文件路径:"xxx.mp4";视频流:"rtsp://admin:admin@192.168.2.211"。''' ret, frame = cap.read() '''返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。'''
注意:有时 cap 可能不能成功的初始化摄像头设备。这种情况下上面的代码会报错。你可以使用 cap.isOpened(),来检查是否成功初始化了。如果返回值是True,那就没有问题。否则就要使用函数 cap.open()。你可以使用函数 cap.get(propId) 来获得视频的一些参数信息。这里propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性,见下表,其中的一些值可以使用 cap.set(propId,value) 来修改,value 就是你想要设置成的新值。例如,我可以使用 cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)和 ret=cap.set(4,240) 来把宽和高改成 320X240。
# 这些值都是常量 CV_CAP_PROP_POS_MSEC视频文件当前位置(以毫秒为单位)。 CV_CAP_PROP_POS_FRAMES接下来要解码/捕获的帧的基于0的索引。 CV CAP PROP POS AVI RATIO视频文件的相对位置:0开始,1结束。 CV_CAP_PROP_FRAME WIDTH视频流中帧的宽度。 CV_CAP_PROP_FRAME_HEIGHT视频流中帧的高度。 CV_CAP_PROP_FPS帧速率。 CV_CAP_PROP_FOURCC编解码器的4个字符代码。 CV_CAP_PROP_FRAME COUNT视频文件。 CV_CAP_PROP_FORMAT通过retrieve()返回Mat对象的格式。 CV_CAP_PROP_MODE后端特定值,指示当前捕获模式。 CV_CAP_PROP_BRIGHTNESS图像的亮度(仅适用于相机)。 CV_CAP_PROP_CONTRAST图像对比度(仅适用于相机)。 CV_CAP PROP SATURATION图像饱和度(仅适用于相机)。 CV_CAP_PROP_HUE图像的色相(仅适用于相机)。 CV_CAP_PROP_GAIN图像增益(仅适用于相机)。 CV_CAP_PROP_EXPOSURE曝光(仅对相机)。 CV_CAP_PROP_CONVERT_RGB布尔标志,指示图像是否应转换为RGB。 CV_CAP_PROP_WHITE_BAIANCE目前不支持cv_cap_prop_rectifier立体声摄像机的整改标志(注:仅DC1394 v 2支持)。
-
-
处理
-
图片:
cv2.line() ,cv2.circle(),cv2.rectangle() 、cv2.ellipse()、cv2.putText() 等
cv2.polylines() 可以被用来画很多条线。只需要把想要画的线放在一个列表中,将这个列表传给函数就可以了。每条线都会被独立绘制。这会比用
cv2.line() 一条一条的绘制要快一些。
# 参数 img:你想要绘制图形的那幅图像。 color:形状的颜色。以 RGB 为例,需要传入一个元组,例如:(255,0,0) 代表蓝色。对于灰度图只需要传入灰度值。 thickness:线条的粗细。如果给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1. linetype:线条的类型,8 连接,抗锯齿等。默认情况是 8 连接。cv2.LINE_AA为抗锯齿,这样看起来会非常平滑。 # cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) img,背景图 pt1,直线起点坐标 pt2,直线终点坐标 color,当前绘画的颜色。如在BGR模式下,传递(255,0,0)表示蓝色画笔。灰度图下,只需要传递亮度值即可。 thickness,画笔的粗细,线宽。若是-1表示画封闭图像,如填充的圆。默认值是1. lineType,线条的类型, 如8-connected类型、anti-aliased线条(反锯齿),默认情况下是8-connected样式ide,cv2.LINE_AA表示反锯齿线条,在曲线的时候视觉效果更佳。 # circle 圆形的中心点坐标和半径大小 # rectangle 矩形: 左上角顶点和右下角顶点的坐标 # ellipse #cv2.ellipse(image, centerCoordinates, axesLength, angle, startAngle, endAngle, color [, thickness[, lineType[, shift]]]) 椭圆:椭圆比较复杂,一个参数是中心点的位置坐标。下一个参数是长轴和短轴的长度。椭圆沿逆时针方向旋转的角度。椭圆弧演顺时针方向起始的角度和结束角度,如果是 0 很 360,就是整个椭圆 image:它是要在其上绘制椭圆的图像。 centerCoordinates:它是椭圆的中心坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。 axesLength:它包含两个变量的元组,分别包含椭圆的长轴和短轴(长轴长度,短轴长度)。 angle:椭圆旋转角度,以度为单位。 startAngle:椭圆弧的起始角度,以度为单位。 endAngle:椭圆弧的终止角度,以度为单位。 color:它是要绘制的形状边界线的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。 thickness:是形状边界线的粗细像素。厚度-1像素将用指定的颜色填充形状。 lineType:这是一个可选参数,它给出了椭圆边界的类型。 shift:这是一个可选参数。它表示中心坐标中的小数位数和轴的值 # cv2.polylines(image, [pts], isClosed, color, thickness) 画多边形,需要指点每个顶点的坐标。用这些点的坐标构建一个大小等于 行数 X1X2 的数组,行数就是点的数目。这个数组的数据类型必须为 int32。 pts:多边形曲行数组。npts:多边形顶点计数器阵列。ncontours:曲行数量。 isClosed:指示绘制的折线是否闭合的标志。如果它们是闭合的,则该函数从每条曲线的最后一个顶点到其第一个顶点绘制一条线 顶点。 color:这是折线的颜色来绘制。对于BGR,我们传递一个元组。 thickness:它是折线边的厚度。
# 列子 # line 直线 img = np.zeros((300,300,3),dtype=np.uint8) # 画片生成 300 × 300, np.zeros()默认的变量类型是float64, 所以指定dtype为 uint8 print(img) #cv2.line(img,(0,0),(300,300),(255,0,0),5) #cv2.line(img,(300,0),(0,300),(0,0,255),5) # circle 圆 cv2.circle(img,(150,150), 50, (0,255,255), -1) # thickness=-1 是填充 # rectangle 矩形 cv2.rectangle(img,(100,0),(200,40),(0,255,0),3) cv2.rectangle(img,(0,100),(40,200),(0,255,0),3) cv2.rectangle(img,(100,260),(200,300),(0,255,0),3) cv2.rectangle(img,(260,100),(300,200),(0,255,0),3) # 椭圆 cv2.ellipse(img,(150,150),(200,50),45,120,240,(255,255,255),1) cv2.ellipse(img,(150,150),(200,50),45,0,60,(255,255,255),1) cv2.ellipse(img,(150,150),(200,50),45,300,360,(255,255,255),1) cv2.ellipse(img,(150,150),(200,50),-45,0,60,(255,255,255),1) cv2.ellipse(img,(150,150),(200,50),-45,300,360,(255,255,255),1) cv2.ellipse(img,(150,150),(200,50),-45,120,240,(255,255,255),1) # 多边形 pts = np.array([[150-(50/math.sqrt(2)), 150-(50/math.sqrt(2))], [100, 40], [150, 80], [200, 40],[150+(50/math.sqrt(2)), 150-(50/math.sqrt(2))], [260,100],[260,100],[220,150],[260,200], [150+(50/math.sqrt(2)), 150+(50/math.sqrt(2))], [200, 260], [150, 220], [100, 260], [150-(50/math.sqrt(2)), 150+(50/math.sqrt(2))], [40, 200], [80, 150], [40, 100], ], np.int32) # 数据类型必须为 int32 pts = pts.reshape((-1, 1, 2)) cv2.polylines(img,[pts],1,(255,100,255),3) # 文字 font=cv2.FONT_HERSHEY_COMPLEX_SMALL cv2.putText(img,'rectangle',(110,20), font, 0.8,(255,255,255),1) cv2.putText(img,'ellipse',(20,50), font, 0.8,(255,255,255),1) cv2.putText(img,'circle',(130,130), font, 0.8,(0,0,0),1) cv2.imshow("img", img) cv2.waitKey(0)
在图片上添加文字
cv2.putText(image, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) image:画布。 text:要绘制的文本字符串。 org:它是图像中文本字符串左下角的坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。 font:它表示字体类型。一些字体类型是FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN等。 fontScale:字体比例因子乘以font-specific基本大小。 color:它是要绘制的文本字符串的颜色。 thickness:它是线的粗细像素。 lineType:这是一个可选参数,它给出了要使用的行的类型。 bottomLeftOrigin:这是一个可选参数。如果为true,则图像数据原点位于左下角。否则,它位于左上角。 # font 参考:https://www.jianshu.com/p/d9b4c31b70be
cv2.setMouseCallback() : 用鼠标画
events=[i for i in dir(cv2) if 'EVENT'in i] # 查看所有的鼠标事件 # 例子 # 当鼠标按下时变为 True drawing=False # 如果 mode 为 true 绘制矩形。按下'm' 变成绘制曲线。 mode=True ix,iy=-1,-1 # 创建回调函数 def draw_circle(event,x,y,flags,param): global ix,iy,drawing,mode # 当按下左键是返回起始位置坐标 if event==cv2.EVENT_LBUTTONDOWN: drawing=True ix,iy=x,y # 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下 elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON: if drawing==True: if mode==True: cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: # 绘制圆圈,小圆点连在一起就成了线,3 代表了笔画的粗细 cv2.circle(img,(x,y),3,(0,0,255),-1) # 下面注释掉的代码是起始点为圆心,起点到终点为半径的 # r=int(np.sqrt((x-ix)**2+(y-iy)**2)) # cv2.circle(img,(x,y),r,(0,0,255),-1) # 当鼠标松开停止绘画。 elif event==cv2.EVENT_LBUTTONUP: drawing==False # if mode==True: # cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) # else: # cv2.circle(img,(x,y),5,(0,0,255),-1) img=np.zeros((800,600,3),np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle) while(1): cv2.imshow('image',img) k=cv2.waitKey(1)&0xFF if k==ord('m'): mode=not mode elif k==27: break
用滑动条做调色板**
cv2.getTrackbarPos(),cv2.creatTrackbar()
cv2.getTrackbarPos() 函数的一个参数是滑动条的名字,第二个参数 是滑动条被放置窗口的名字,第三个参数是滑动条的默认位置。第四个参数是 滑动条的最大值,第五个函数是回调函数,每次滑动条的滑动都会调用回调函 数。回调函数通常都会含有一个默认参数,就是滑动条的位置; 滑动条的另外一个重要应用就是用作转换按钮。默认情况下 OpenCV 本 身不带有按钮函数。所以我们使用滑动条来代替 def nothing(x): pass # 创建一副黑色图像 img=np.zeros((300,512,3),np.uint8) cv2.namedWindow('image') cv2.createTrackbar('R','image',0,255,nothing) cv2.createTrackbar('G','image',0,255,nothing) cv2.createTrackbar('B','image',0,255,nothing) switch='0:OFF\n1:ON' cv2.createTrackbar(switch,'image',0,1,nothing) while(1): cv2.imshow('image',img) k=cv2.waitKey(1)&0xFF if k==27: break r=cv2.getTrackbarPos('R','image') g=cv2.getTrackbarPos('G','image') b=cv2.getTrackbarPos('B','image') s=cv2.getTrackbarPos(switch,'image') if s==0: img[:]=0 else: img[:]=[b,g,r] cv2.destroyAllWindows()
-
-
保存
-
图片:imwrite
cv2.imwrite('aaa.jpeg',img)
-
视频:
fourcc = cv2.VideoWriter_fourcc(*'XVID') width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) out = cv2.VideoWriter('output.avi',fourcc, 20.0, (width,height)) # 注意保存的视屏尺寸 ''' cv2.VideoWriter(filename,fourcc,fps,frameSize[,isColor]) VideoWriter_fourcc()函数用来指定视频的编码格式, fps:帧速率,比如录制视频每秒30帧,或者60帧等。 frameSize:帧的长宽 isColor:是否为彩色图像''' while(cap.isOpened()): ret, frame = cap.read() if ret==True: # frame = cv2.flip(frame,1) # 视频内容翻转函数 out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) == 27: # exc退出 break else: break cap.release() out.release() # 保存视屏正常退出,否则保存的视屏看不成 cv2.destroyAllWindows()
# 常用的视频的编码格式: cv2.VideoWriter_fourcc('I','4','2','0') 未压缩的YUV颜色编码格式,色度子采样为4:2:0,该编码格式具有较好的兼容性,但生成的视频文件较大,文件扩展名为.avi cv2.VideoWriter_fourcc('P','I','M','I') MPEG-1编码格式,生成的文件扩展名为.avi cv2.VideoWriter_fourcc('X','V','I','D') MPEG-4编码格式,如果希望得到的视频大小为平均值,可以选用这个参数组合。文件扩展名为.avi cv2.VideoWriter_fourcc('T','H','E','O') Ogg Vorbis编码格式,文件扩展名为.ogv cv2.VideoWriter_fourcc('F','L','V','I') Flash视频格式,文件扩展名为.flv cv2.VideoWriter_fourcc(*"MP4V") 文件扩展名.mp4
注意:一定要保证电脑安装了ffmpeg 或者 gstreamer。
-