赞
踩
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 cv2
-
- img=cv2.imread("path1",-1) ###path1表示读取图片路径,第二个参数默认以RGB读取,0是灰度图,-1是以原始数据类型读取
- 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()来构建金字塔,常用来实现对多尺度目标的检测。
- #创建一个图像,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 np
-
- pts = [] # 用于存放点
- # 统一的: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)) # 用于求 ROI
- mask3 = 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()

由于opencv对中文的支持并不友好,所以想在图上显示中文,需要借助PIL进行一个简单的转化,具体操作,封装成如下函数,可以直接拿去使用,
- import numpy as np
- import cv2
- from PIL import Image,ImageDraw,ImageFont
-
- def cv2_putChineseText(image,strs,local,sizes,colour):
- '''
- Args:
- image:BGR image
- strs: 中文字符
- 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 np
-
-
- def 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 0
- for (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 1
- for (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 plt
-
- img=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的使用之中。基于这些运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析和处理,包括图像分割、特征提取、边缘检测、图像滤波、图像增强和恢复等。
具体操作代码如下:
- import cv2
-
- src=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 cv2
-
- img=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 plt
-
- img = 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 np
-
- img = 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)
- # 如果凸包点集中的点个数大于5
- if 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 plt
-
- img1 = 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 dictionary
-
- flann = 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 = False
-
- timeF = 5 # 视频帧计数间隔频率
-
- while rval:
- # 循环读取视频帧
- rval, frame = vc.read()
- #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
-
- # Display the resulting frame
- try:
- cv2.imshow('frame', frame)
- except:
- pass
-
- if (c % timeF == 0): # 每隔timeF帧进行存储操作
- cv2.imwrite('crop/image' + str(c) + '.jpg', frame) # 存储为图像
- c = c + 1
- if 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'):
- break
- cap.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=True
- process.start()
-
- for process in processes:
- process.join()
-
-
- if __name__=="__main__":
- #readSingleCap()
- readMultiCap()

(6)OpenCV之深度学习
作为一个常用的图像处理库,OpenCV可以嵌入到任何图像处理的场景中,当然也包括人工智能这块。这里就目标跟踪这一块进行一个小小的总结,共八种基于OpenCV的目标跟踪算法,
个人建议如果追求高准确度,又能忍受慢一些的速度,那么就用CSRT;如果对准确度的要求不苛刻,想追求速度,那么就选KCF;纯粹想节省时间就用MOSSE。
- #pip3 install opencv-contrib-python
- import numpy as np
- import cv2
- import sys
-
- class TRACKER(object):
- def __init__(self):
- self.trackerTypes = ['BOOSTING', 'MIL', 'KCF','TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']
- self.trackerNum=2
- self.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 = None
- print('Incorrect tracker name')
- print('Available tracker name')
-
- for t in self.trackerTypes:
- print(t)
- return tracker
-
- def add(self,image, bbox):
- ok = self.tracker.add(self.createTrackerByName(self.trackerNum), image, bbox)
- return ok
-
- def 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 ok
-
- def update(self,image):
- ok, boxes = self.tracker.update(image)
- return ok,boxes
-
- if __name__=="__main__":
- cv2.namedWindow("tracking")
- camera = cv2.VideoCapture("../siz.mp4")
-
-
- tracker = TRACKER()
-
-
-
-
- init_once = False
-
- ok, 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')
- break
-
- if not init_once:
- ok = tracker.add( image, bbox1)
- ok = tracker.add( image, bbox2)
- init_once = True
-
- ok, 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

一些最近出现的问题:
(1)有时候使用opencv出现AttributeError: module 'cv2' has no attribute 'xfeatures2d'错误,网上的说法是涉及到一些专利原因需要将opencv的版本降到3.4.2.16即可,但是我在安装3.4.2.16时,一直存在找不到的问题,将python的版本从3.9切换到3.7还是不能解决,最后尝试安装了一下如下版本,
- pip install opencv-python==4.6.0.66 -i https://pypi.douban.com/simple
- pip install opencv-contrib-python==4.7.0.68 -i https://pypi.douban.com/simple
最后这个报错消失,但是具体什么原因还是有点困惑,下次有时间再细细研究吧!
(2)有时候出现qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/amax/anaconda3/lib/python3.9/site-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem,网上找了很多方法好像说是opencv与pyqt之间存在一下冲突,解决方法有
- ####case 1
- pip uninstall opencv-python
- pip install opencv-python-headless
-
- ####case 2
- envpath = '/home/uto/anaconda3/lib/python3.9/site-packages/cv2/qt/plugins/platforms'
- os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = envpath
未完待续!
参考链接:
浅墨_毛星云的博客_CSDN博客-【Visual C++】游戏开发,【Visual C++】游戏开发,【Visual C++】领域博主(毛星云博客)
python-opencv2利用cv2.findContours()函数来查找检测物体的轮廓_hjxu2016的博客-CSDN博客_cv2.findcontours(利用cv2.findContours()函数来查找检测物体的轮廓)
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跟踪)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。