OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法(百度定义)。只要你接触到图像处理这块,肯定会用到这个库,详情可查看https://opencv.org/,至于下载使用的话,在windows下可以借助vs+OpenCV来实现,而在linux下直接pip install python-opencv即可。本文在这里就常用的一些操作结合自己日常的使用进行如下总结:

(1)基本操作(读取、保存、滤波、resize等常见操作)

在日常的使用过程中,我们对图像最基本的操作包括,读取,裁剪,改变大小、滤波,保存修改等操作,具体操作代码如下:

import os
import cv2img=cv2.imread("path1")  ###path1表示读取图片路径,第二个参数可以指定RGB还是灰度图
img2=cv2.resize(img,(400,400)) ###改变大小
img3=img[50:300,50:300]  ###crop小图
cv2.rectangle(img,(0,0),(100,100),(255,0,0),2) ###图上画框
cv2.putText(img,"panda",(100,200),cv2.FONT_HERSHEY_SIMPLEX,2,(0,255,0), 3)  ###图上加文字标签 参数(图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细)
img4=cv2.blur(img,(3,3))  ###均值滤波(blur),方框滤波(boxfilter),高斯滤波(Guassianblur),中值滤波(.medianBlur)
cv2.imwrite("dst.jpg",img)  ##保存图片
cv2.imshow("1",img) ##显示图片
cv2.waitKey()

注意:

  • 图片格式

由于利用cv2.imread()读取图片时,读取的顺序的GBR,这和常见的RGB有点区别,有时候会出现图像颜色变绿等情况,与Image.open()方式不同,这时候需要将图像的通道顺序进行调整即可,常见的操作为img=img.transpose((2,0,1))或img=img[...,-1::-1]。

  • 图像金字塔

图像金字塔指的是通过对图像进行放大缩小形成一序列的图像,如下图所示,堆叠起来像一座金字塔,Opencv中可以通过函数cv2.pyrDown()和cv2.pyrUp()来构建金字塔,常用来实现对多尺度目标的检测。

  • 在图像上进行画图操作
  1. 画直线:line
  2. 画椭圆:ellipse
  3. 画矩形:rectangle
  4. 画圆:circle
  5. 画多边形:polylines
  6. 填充的多边形:fillPoly
#创建一个图像,300×400大小,数据类型无符号8位
img=np.zeros((300,400,3),np.uint8)
cv2.line(img,(10,10),(200,200),(0,255,0),3)#绿色,3个像素宽度cv2.rectangle(img,(10,10),(30,40),(134,2,34),1)  ##画矩形cv2.circle(img,(60,60),30,(0,0,213),-1) ##画圆形cv2.ellipse(img,(256,256),(100,50),0,0,180,(20,213,79),-1) #线型-1表示填充,椭圆#####多边形
import numpy as np
pts=np.array([[10,3],[48,19],[60,3],[98,19]],np.int32) #数据类型必须是int32
pts=pts.reshape((-1,1,2))
'''这里 reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。如果第三个参数是 False,我们得到的多边形是不闭合的(首尾不相连)。
'''
cv2.polylines(img,[pts],True,(0,0,255),1) # 图像,点集,是否闭合,颜色,线条粗细

绘制多边形

import cv2
import numpy as nppts = []  # 用于存放点
# 统一的:mouse callback function
def on_mouse(event, x, y, flags, param):img2 = img.copy()if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点pts.append((x, y))if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点pts.pop()if event == cv2.EVENT_RBUTTONDBLCLK:  # 右键双击绘制轮廓mask = np.zeros(img.shape, np.uint8)#掩膜points = np.array(pts, np.int32)points = points.reshape((-1, 1, 2))# 画多边形mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255))  # 用于求 ROImask3 = cv2.fillPoly(mask.copy(), [points], (200, 255, 0))  # 用于 显示在桌面的图像show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)#cv2.imshow("mask", mask2)cv2.imshow("show_img3", show_image)ROI = cv2.bitwise_and(mask2, img)cv2.imshow("ROI", ROI)cv2.waitKey(0)if len(pts) > 0:# 将pts中的最后一点画出来cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)if len(pts) > 1:# 画线for i in range(len(pts) - 1):cv2.circle(img2, pts[i], 5, (0, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)cv2.imshow('image', img2)# 创建图像与窗口并将窗口与回调函数绑定
img = cv2.imread("2.jpg")
cv2.namedWindow('image')
cv2.setMouseCallback('image', on_mouse)
print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,双击右键:确定ROI区域")
print("[INFO] 按 ESC 退出")
cv2.waitKey()
cv2.destroyAllWindows()
  • puttext无法显示中文问题

由于opencv对中文的支持并不友好,所以想在图上显示中文,需要借助PIL进行一个简单的转化,具体操作,封装成如下函数,可以直接拿去使用,

import numpy as np
import cv2
from PIL import Image,ImageDraw,ImageFontdef cv2_putChineseText(image,strs,local,sizes,colour):'''Args:image:BGR imagestrs: 中文字符local: 位置信息sizes: 字体大小colour: 字体颜色Returns:  返回BGR图像'''cv2img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)pilimg = Image.fromarray(cv2img)draw = ImageDraw.Draw(pilimg)  # 图片上打印font = ImageFont.truetype("SIMYOU.TTF",sizes, encoding="utf-8")draw.text(local, strs, colour, font=font)image = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)return image

至于上面使用的“SIMYOU.TTF”可以在这里下载,安装可以参考链接。

  • 基于像素点操作

基于python可以通过下标索引实现对图像的遍历处理

import cv2 as cv
import numpy as npdef image_pixel(image_path: str):img = cv.imread(image_path, cv.IMREAD_COLOR)cv.imshow('input', img)h, w, c = img.shape# 遍历像素点,修改图像b,g,r值for row in range(h):for col in range(w):b, g, r = img[row, col]# img[row, col] = (255 - b, 255 - g, 255 - r)# img[row, col] = (255 - b, g, r)# img[row, col] = (255 - b, g, 255 - r)img[row, col] = (0, g, r)cv.imshow('result', img)cv.imwrite('images/result.jpg', img)cv.waitKey(0)cv.destroyAllWindows()

如果是c++还可以通过指针实现

void OpencvExample::Example_PixelOperation(Mat &image)
{int channel = image.channels();int h = image.rows;int w = image.cols;cout <<"height:" <<h <<","<< "width:"<<w << endl;
/* 以数组方式 */
#if 0for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){/* 单通道图像 */if (1 == channel){image.at<uchar>(row, col) = 255 - image.at<uchar>(row, col); //该点像素值取反}/* 三通道图像 */if (3 == channel){Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}namedWindow("OUT WINDOW", WINDOW_FREERATIO);imshow("OUT WINDOW", image);}
#endif
/* 以指针方式 */
#if 1for (int row = 0; row < h; row++){uchar *prow = image.ptr<uchar>(row);for (int col = 0; col < w; col++){/* 单通道图像 */if (1 == channel){*prow++ = 255 - *prow; //该点像素值取反}/* 三通道图像 */if (3 == channel){*prow++ = 255 - *prow;*prow++ = 255 - *prow;*prow++ = 255 - *prow;}}namedWindow("OUT WINDOW", WINDOW_FREERATIO);imshow("OUT WINDOW", image);}
#endif
}

(2) 阈值化

阈值化,即设定阈值,根据是否满足阈值条件分别进行不同的处理,常见的就是对图像进行二值化,OpenCV里提供的方式有简单阈值、自适应阈值、Otsu’s二值化等几种。具体代码如下

import os
import cv2
import matplotlib.pyplot as pltimg=cv2.imread(path1,0) ###以灰度图的方式读入path1的图片
plt.figure(0)
plt.hist(img.ravel(),256,[0,256]) ##统计图像直方图
_,dst1=cv2.threshold(img,120,255,cv2.THRESH_BINARY)  ##以固定阈值进行二值化,当方法设为cv2.THRESH_OTSU即为otsu
dst2=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) ##自适应阈值二值化
dst=[img,dst1,dst2]
plt.figure(1)
for i in range(3):plt.subplot(1,3,i+1),plt.imshow(dst[i],'gray')
plt.show()

效果图如下所示,依次是原图灰度图,固定阈值,自适应阈值,OTSU效果图:

(3)形态学处理

膨胀、腐蚀、开运算和闭运算是数学形态学的四个基本运算,是针对二值化图像进行的,常见于mask的使用之中。基于这些运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析和处理,包括图像分割、特征提取、边缘检测、图像滤波、图像增强和恢复等。

  • 腐蚀:腐蚀会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
  • 膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪是,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来将两者物体分开。
  • 开运算:先腐蚀后膨胀,用于移除由图像噪音形成的斑点。
  • 闭运算:先膨胀后腐蚀,用来连接被误分为许多小块的对象;

具体操作代码如下:

import cv2src=cv2.imread("1.jpg",0)
_,img=cv2.threshold(src,120,255,cv2.THRESH_BINARY)
#OpenCV定义的结构矩形元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
eroded = cv2.erode(img,kernel)        #腐蚀图像
dilated = cv2.dilate(img,kernel)      #膨胀图像
closed1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel,iterations=1)    #闭运算1
closed2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel,iterations=3)    #闭运算2
opened1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel,iterations=1)     #开运算1
opened2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel,iterations=3)     #开运算2
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)             #梯度
plt.figure()
dst=[img,eroded,dilated,closed1,closed2,opened1,opened2,gradient]
for i in range(len(dst)):plt.subplot(2,4,i+1)plt.imshow(dst[i],'gray')
plt.show()

具体效果图如下

(4)图像变换检测

边缘检测:

想要提取图像物体边缘信息,OpenCV提供了封装的边缘提取算子,常见的有canny算子,sobel算子,Laplacian算子,scharr滤波器等。

import cv2img=cv2.imread("1.jpg")
dst1=cv2.Canny(img,100,200) ##canny方法
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)  ##水平方向梯度
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)  ##垂直方向梯度
dst2=cv2.Laplacian(img,cv2.CV_64F)  ##laplacian方法
scharrx=cv2.Scharr(o,cv2.CV_64F,1,0)
scharrx=cv2.convertScaleAbs(scharrx) ##水平方向梯度
scharry=cv2.Scharr(o,cv2.CV_64F,0,1)
scharry=cv2.convertScaleAbs(scharry) ##垂直方向梯度
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0) ###融合水平和垂直方向信息

直线(圆)检测:

在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换就是这样一种检测的工具。

import cv2
import numpy as np
import matplotlib.pyplot as pltimg = cv2.imread('room.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度图像
edges = cv2.Canny(gray,50,200)
plt.subplot(121),plt.imshow(edges,'gray')
plt.xticks([]),plt.yticks([])#hough transform
lines = cv2.HoughLinesP(edges,1,np.pi/180,30,minLineLength=60,maxLineGap=10)
lines1 = lines[:,0,:]#提取为二维
for x1,y1,x2,y2 in lines1[:]: cv2.line(img,(x1,y1),(x2,y2),(255,0,0),1)plt.subplot(122),plt.imshow(img,)
plt.xticks([]),plt.yticks([])

效果图,

轮廓检测:

将图像上的目标的轮廓用点将其描绘出来就是轮廓检测,在OpenCV里提供了findContours来实现这一功能。为获得更好的准确性,请使用二值图,在找到轮廓之前,应用阈值法或canny边缘检测。具体操作如下:

# 轮廓检测
import cv2
import numpy as npimg = np.zeros((200, 200), dtype=np.uint8)
img[50:150, 50:150] = 200
cv2.imshow("before", img)ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("thresh", thresh)image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  ###找到轮廓color = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR)
cv2.drawContours(color, contours, -1, (0, 255, 0), 2)  ##画出轮廓
cv2.imshow("contours", color)# 寻找物体的凸包并绘制凸包的轮廓
for cnt in contours:hull = cv2.convexHull(cnt)length = len(hull)# 如果凸包点集中的点个数大于5if length > 5:# 绘制图像凸包的轮廓for i in range(length):cv2.line(dd, tuple(hull[i][0]), tuple(hull[(i+1)%length][0]), (0,0,255), 2)plt.figure()
plt.imshow(dd)
plt.show()cv2.waitKey()
cv2.destroyAllWindows()

(5)特征点检测与匹配

特征点又称兴趣点、关键点,它是在图像中突出且具有代表意义的一些点,通过这些点我们可以用来识别图像、进行图像配准、进行3D重建等,OpenCV提供了几种常见的特征点提取算法,

Harris角点:角点是图像中最基本的一种关键点,它是由图像中一些几何结构的关节点构成,很多都是线条之间产生的交点。Harris角点是一类比较经典的角点类型,它的基本原理是计算图像中每点与周围点变化率的平均值。

FAST特征点:harris特征在算法复杂性上比较高,在大的复杂的目标识别或匹配应用上效率不能满足要求,OpenCV提供了一个快速检测角点的类FastFeatureDetector,而实际上FAST并不是快的意思,而是Features from Accelerated Segment Test,但这个算法效率确实比较高。

SIFT特征:也叫尺度不变特征变换算法,Sift特征是图像的局部特征 对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有良好的不变性,对视觉变化、仿射变换也保持一定程度的稳定性。独特性好 信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。具有多量性;速度相对较快 ;可扩展性强 。

尺度不变的SURF特征:surf特征是类似于SIFT特征的一种尺度不变的特征点,它的优点在于比SIFT效率要高,在实际运算中可以达到实时性的要求。

通过提取图像特征点,接下来可以利用特征点对两张图像进行匹配,具体操作如下:

import numpy as np
import cv2
from matplotlib import pyplot as pltimg1 = cv2.imread('xiaoyuanka.jpg',0)# queryImage
img2 = cv2.imread('xiaoyuanka_sence.jpg',0) # trainImage# Initiate SIFT detector
sift = cv2.xfeatures2d.SIFT_create()   ###slam中用orb = cv2.ORB_create()# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)# or pass empty dictionaryflann = cv2.FlannBasedMatcher(index_params,search_params)matches = flann.knnMatch(des1,des2,k=2)'''
####case 2
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
'''# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):if m.distance < 0.7*n.distance:matchesMask[i]=[1,0]draw_params = dict(matchColor = (0,255,0),singlePointColor = (255,0,0),matchesMask = matchesMask,flags = 0)img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)
plt.imshow(img3),plt.show()
cv2.imshow('drawMatches',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

匹配结果如下图

补:

》OpenCV应用很广,在对视频处理抽帧时可以通过调用opencv的VideoCapture、imgwrite 来提取实现

import cv2
vc = cv2.VideoCapture('SampleVideo_1280x720_1mb.mp4')  # 读入视频文件
c=1
if vc.isOpened():  # 判断是否正常打开rval, frame = vc.read()
else:rval = FalsetimeF = 5  # 视频帧计数间隔频率while rval:# 循环读取视频帧rval, frame = vc.read()#gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# Display the resulting frametry:cv2.imshow('frame', frame)except:passif (c % timeF == 0):  # 每隔timeF帧进行存储操作    cv2.imwrite('crop/image' + str(c) + '.jpg', frame)  # 存储为图像c = c + 1if cv2.waitKey(1) & 0xFF == ord('q'):break
vc.release()
cv2.destroyAllWindows()

至于读取多个摄像头,可以借助多线程实现,具体代码如下

#!/usr/bin/python
#-*-:coding:utf8-*-import cv2
import time
import multiprocessing as mp###读取单个摄像头或视频
def readSingleCap():cap=cv2.VideoCapture(0)while cap.isOpened():ret,frame=cap.read()cv2.imshow("hehe",frame)if cv2.waitKey(100) & 0xff==ord('q'):breakcap.release()cv2.destroyAllWindows()####读取多个摄像头或视频
class readMultiCap(object):def __init__(self):self.runMultiCap()def push_frame(self,que_list,user, pwd, ip, channel=1):cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" % (user, pwd, ip, channel))if cap.isOpened():print('HIKVISION')else:cap = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel))print('DaHua')while True:_,frame=cap.read()que_list.put(frame)que_list.get() if que_list.qsize()>1 else time.sleep(0.01)def get_frame(self,que_list,window_name):cv2.namedWindow(window_name,flags=cv2.WINDOW_FREERATIO)while True:frame=que_list.get()cv2.imshow(window_name,frame)cv2.waitKey()def runMultiCap(self):user_name, user_pwd = "admin", "admin123456"camera_ip_l = [    # 把你的摄像头的地址放到这里,如果是ipv6,那么需要加一个中括号。"172.16.113.74",  # ipv4"[fe80::3aaf:29ff:fed3:d260]",  # ipv6  ]mp.set_start_method(method="spawn")queues=[mp.Queue(maxsize=4) for _ in camera_ip_l]processes=[]for queue,camera_ip in zip(queues,camera_ip_l):processes.append(mp.Process(target=self.push_frame,args=(queue,camera_ip)))processes.append(mp.Process(target=self.get_frame,args=(queue,camera_ip)))for process in processes:process.daemon=Trueprocess.start()for process in processes:process.join()if __name__=="__main__":#readSingleCap()readMultiCap()

(6)OpenCV之深度学习

作为一个常用的图像处理库,OpenCV可以嵌入到任何图像处理的场景中,当然也包括人工智能这块。这里就目标跟踪这一块进行一个小小的总结,共八种基于OpenCV的目标跟踪算法,

  • BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的机器学习算法相同,但是距其诞生已有十多年了。这一追踪器速度较慢,并且表现不好,但是作为元老还是有必要提及的。(最低支持OpenCV 3.0.0)
  • MIL Tracker:比上一个追踪器更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)
  • KCF Tracker:比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)
  • CSRT Tracker:比KCF稍精确,但速度不如后者。(最低支持OpenCV 3.4.2)
  • MedianFlow Tracker:在报错方面表现得很好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)
  • TLD Tracker:我不确定是不是OpenCV和TLD有什么不兼容的问题,但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)
  • MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)
  • GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行,本文不详细讲解。(最低支持OpenCV 3.2.0)

个人建议如果追求高准确度,又能忍受慢一些的速度,那么就用CSRT;如果对准确度的要求不苛刻,想追求速度,那么就选KCF;纯粹想节省时间就用MOSSE。

#pip3 install opencv-contrib-python
import numpy as np
import cv2
import sysclass TRACKER(object):def __init__(self):self.trackerTypes = ['BOOSTING', 'MIL', 'KCF','TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']self.trackerNum=2self.tracker = cv2.MultiTracker_create()def createTrackerByName(self,num):# 通过跟踪器的名字创建跟踪器trackerType=self.trackerTypes[num]if trackerType == self.trackerTypes[0]:tracker = cv2.TrackerBoosting_create()elif trackerType == self.trackerTypes[1]: tracker = cv2.TrackerMIL_create()elif trackerType == self.trackerTypes[2]:tracker = cv2.TrackerKCF_create()elif trackerType == self.trackerTypes[3]:tracker = cv2.TrackerTLD_create()elif trackerType == self.trackerTypes[4]:tracker = cv2.TrackerMedianFlow_create()elif trackerType == self.trackerTypes[5]:tracker = cv2.TrackerGOTURN_create()elif trackerType == self.trackerTypes[6]:tracker = cv2.TrackerMOSSE_create()elif trackerType == self.trackerTypes[7]:tracker = cv2.TrackerCSRT_create()else:tracker = Noneprint('Incorrect tracker name')print('Available tracker name')for t in self.trackerTypes:print(t)return trackerdef add(self,image, bbox):ok = self.tracker.add(self.createTrackerByName(self.trackerNum), image, bbox)return okdef clear(self,image,bbox):print(help(self.tracker.clear))print(help(self.tracker.empty))print(dir(self.tracker))ok = self.tracker.clear()ok = self.tracker.empty()return okdef update(self,image):ok, boxes = self.tracker.update(image)return ok,boxesif __name__=="__main__":cv2.namedWindow("tracking")camera = cv2.VideoCapture("../siz.mp4")tracker = TRACKER()init_once = Falseok, image=camera.read()if not ok:print('Failed to read video')exit()bbox1 = cv2.selectROI('tracking', image)bbox2 = cv2.selectROI('tracking', image)while camera.isOpened():ok, image=camera.read()if not ok:print ('no image to read')breakif not init_once:ok = tracker.add( image, bbox1)ok = tracker.add( image, bbox2)init_once = Trueok, boxes = tracker.update(image)print (ok, boxes)for newbox in boxes:p1 = (int(newbox[0]), int(newbox[1]))p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))cv2.rectangle(image, p1, p2, (255,0,0))cv2.imshow('tracking', image)k = cv2.waitKey(1)if k == 27 : break # esc pressed

未完待续!

参考链接:

浅墨_毛星云的博客_CSDN博客-【Visual C++】游戏开发,【Visual C++】游戏开发,【Visual C++】领域博主(毛星云博客)

python-opencv2利用cv2.findContours()函数来查找检测物体的轮廓_hjxu2016的博客-CSDN博客_cv2.findcontours(利用cv2.findContours()函数来查找检测物体的轮廓)

python-opencv绘图函数(cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse() cv2. cv2.putText() )_音柯路德的博客-CSDN博客_cv2.line(绘图函数)

python cv2 opencv 计算 任意区域形心_rrr2的博客-CSDN博客_cv2 形心(计算任意区域形心)

https://blog.csdn.net/huayunhualuo/article/details/81478037(基于OpenCV的边缘检测)

python opencv 特征匹配_兔子家的鱼的博客-CSDN博客(python opencv 特征匹配)

OpenCV上八种不同的目标追踪算法-电子发烧友网(OpenCV上八种不同的目标追踪算法)

opencv跟踪(BOOSTING, MIL, KCF,TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT)_watersink的博客-CSDN博客(opencv跟踪)

图像处理之opencv库使用小结相关推荐

  1. 【图像处理】openCV库教程

    openCV 基础学习 with:于士琪openCV基础 env:opencv3.4.0+vc2017集成开发环境 图像的表示:矩阵 1. 灰度矩阵 <br> 2. 彩色(多通道)如RGB ...

  2. Python图像处理丨OpenCV+Numpy库读取与修改像素

    本文分享自华为云社区<[Python图像处理] 二.OpenCV+Numpy库读取与修改像素>,作者: eastmount. 一.传统读取像素方法 1.灰度图像,返回灰度值. 返回值=图像 ...

  3. c++平台上配置opencv库《帅家家图像处理篇》

    引言:废话不多说!!! 首先我的环境配置了好几天,但是存在一些问题,调试好了之后,记录一下吧!!! 1.vs2019安装 1>首先下载,然后减压,然后一路点击!!! 压缩包文件 2>解压, ...

  4. 在Qt 中如何使用OpenCV库

    OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时 ...

  5. python opencv创建图像_使用Python中OpenCV库创建一幅图片的RGB通道图片

    我们知道,在使用PhotoShop进行图片的抠取.创建和存储选区.存储图像的色彩资料等复杂操作时,经常会用到一个功能,那就是"RGB"通道,它能从三原色角度对一幅图片进行精准处理. ...

  6. python下载opencv库_Window系统下Python如何安装OpenCV库

    关于OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C ...

  7. [图像处理] Python+OpenCV实现车牌区域识别及Sobel算子

    由于最近太忙,这篇文章只给出相关代码供大家学习,过一段时间会详细的写一些列Python图像处理的文章,包括各种算法原理.图像识别.图像增强.图像分类.深度学习等.本篇文章主要调用OpenCV库(cv2 ...

  8. matlab调用opencv库,matlab调用opencv库

    matlab中有许多图像处理的函数简单方便,比如矩阵x 求垂直积分 直接sum(x) 就可以了.不知道OPENCV里面有没有类似的功能,反正我是没找到.就准备用matlab调用OPENCV里面的函数. ...

  9. python的opencv库_用于Python的Opencv可视化库安装,面向,OpenCV,视觉

    计算机视觉最重要的库莫过于OpenCV,ananconda功能很强大,但是也有比较重要的几个库,还没做成集成开发环境,需要自己安装. 在安装的过程中也走了许多弯路,因为安装的方法有许多许多,有些随着O ...

最新文章

  1. GDCM:读取gdcm::DataSetHelper的测试程序
  2. phpcms文件结构
  3. 非线性时延系统matlab框图,非线性主-从时延系统的时滞相关有限时间同步控制方法与流程...
  4. 集群-如何理解集群?
  5. 开发一款浏览器内核需要学习哪些方面的知识?
  6. mysql查询表字段的个数
  7. Java基础增强:集合的嵌套案例
  8. 【图像分割】基于matlab免疫遗传算法单阈值图像分割【含Matlab源码 729期】
  9. 计算机系第一学期电脑,公共课第一学期《计算机基础》.doc
  10. C语言-输入任意多个数字,数字间用空格隔开,然后将数字求和。
  11. 本台计算机没有权限使用网络资源,你可能没有权限使用网络资源,详细教您你可能没有权限使用网络资源怎么解决...
  12. c# chart 各个属性_C#Chart各个属性详细解析、应用
  13. 华为交换机SNMPv2配置步骤
  14. LR杂记--Loadrunner分析系统资源
  15. 线下 Meetup 预告|从原理到实战,详解 Database Plus 的互联网最佳实践
  16. 《铸梦之路》帧同步卡牌放置手游(斗罗大陆武魂觉醒、上古王冠)
  17. python输入名字、输出欢迎你_Python交互环境下打印和输入函数的实例内容
  18. 【面试题】面向对象与面向过程的区别
  19. Ironic注册/部署/inspect/clean节点操作记录
  20. CAD删除Entity的所有XData(ResultBuffer)信息,C# .NET

热门文章

  1. C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流
  2. 区块链集体癫狂的背后是互联网行业缺乏创新的焦虑
  3. 一名测试开发工程师的内心自白,被裁员之前,没得到任何风声,措手不及......
  4. 怎样给音乐变速变调调音?不妨试试这些变声变调方法
  5. android 广播震动,android 震动和提示音的实现代码
  6. 大文件分片上传前后端实现
  7. CSTRING与lpvoid之间的转换
  8. Linux系统下管理员账号root忘记密码怎么找回
  9. 阿里算法工程师内推面试经历
  10. 用计算机程序实现离散化的对象模型,模糊PID应用