详解OpenCV中的Lucas Kanade稀疏光流单应追踪器
生活随笔
收集整理的這篇文章主要介紹了
详解OpenCV中的Lucas Kanade稀疏光流单应追踪器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
詳解OpenCV中的Lucas Kanade稀疏光流單應追蹤器
- 1. 效果圖
- 2. 源碼
- 參考
這篇博客將詳細介紹OpenCV中的Lucas Kanade稀疏光流單應追蹤器。
- 光流是由物體或相機的運動引起的圖像物體在連續兩幀之間的明顯運動的模式。
- Lucas Kanade是一個算法,用于稀疏光流的追蹤;
1. 效果圖
單應追蹤器效果圖如下:
選中隨機特征點為紅色,判斷幀之間是否存在關聯關系,存在則繪制軌跡線。每幀均可選擇新的隨機點作為特征點;
2. 源碼
# Lucas Kanade稀疏光流單應追蹤器demo
# 使用GoodFeatures用于跟蹤初始化特征點和回溯幀之間的匹配驗證。
# 查找引用視圖和當前視圖之間的單應性。
# Lucas-Kanade sparse optical flow demo. Uses goodFeaturesToTrack
# for track initialization and back-tracking for match verification
# between frames. Finds homography between reference and current views.
#
# Usage
# python lk_homography.py images/slow_traffic_small.mp4
# 按 ESC 退出
# 空格開始追蹤
# 按 r 隨機切換from __future__ import print_functionimport cv2# 在目標圖像dst的target位置開始繪制文本s
import imutilsdef draw_str(dst, target, s):x, y = targetcv2.putText(dst, s, (x + 1, y + 1), cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 0), thickness=2, lineType=cv2.LINE_AA)cv2.putText(dst, s, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.0, (255, 255, 255), lineType=cv2.LINE_AA)lk_params = dict(winSize=(19, 19),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))feature_params = dict(maxCorners=1000,qualityLevel=0.01,minDistance=8,blockSize=19)def checkedTrace(img0, img1, p0, back_threshold=1.0):p1, _st, _err = cv2.calcOpticalFlowPyrLK(img0, img1, p0, None, **lk_params)p0r, _st, _err = cv2.calcOpticalFlowPyrLK(img1, img0, p1, None, **lk_params)d = abs(p0 - p0r).reshape(-1, 2).max(-1)status = d < back_thresholdreturn p1, statusgreen = (0, 255, 0)
red = (0, 0, 255)class App:def __init__(self, video_src):self.cam = self.cam = cv2.VideoCapture(video_src)self.p0 = Noneself.use_ransac = Truedef run(self):num = 0while True:_ret, frame = self.cam.read()if not _ret:break# 轉換灰度圖frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 復制幀vis = frame.copy()if self.p0 is not None:p2, trace_status = checkedTrace(self.gray1, frame_gray, self.p1)self.p1 = p2[trace_status].copy()self.p0 = self.p0[trace_status].copy()self.gray1 = frame_grayif len(self.p0) < 4:self.p0 = Nonecontinue# findHomography(srcPoints, dstPoints[, method[, ransacReprojThreshold[, mask[, maxIters[, confidence]]]]]) -> retval, mask# 查找兩個平面之間的透視變換# - p0: 原始平面中點的坐標,CV_32FC2或點向量# - p1: 目標平面中點的坐標,CV_32FC2或點向量# - method: 用于計算單應矩陣的方法。可以采用以下方法:# 0: 使用所有點的常規方法,即最小二乘法# RANSAC: 基于RANSAC的魯棒方法# LMEDS: 最小中值穩健法# 基于RHO**-PROSAC的魯棒方法# - ransAcreProjectThreshold: 將點對視為內部對象時允許的最大重投影錯誤H, status = cv2.findHomography(self.p0, self.p1, (0, cv2.RANSAC)[self.use_ransac], 10.0)h, w = frame.shape[:2]overlay = cv2.warpPerspective(self.frame0, H, (w, h))vis = cv2.addWeighted(vis, 0.5, overlay, 0.5, 0.0)for (x0, y0), (x1, y1), good in zip(self.p0[:, 0], self.p1[:, 0], status[:, 0]):# 如果倆幀中間可回溯,有關聯,繪制光流線if good:cv2.line(vis, (x0, y0), (x1, y1), (0, 128, 0))# 可回溯,繪制綠色點,不可回溯繪制隨機紅色特征點cv2.circle(vis, (x1, y1), 2, (red, green)[good], -1)draw_str(vis, (20, 20), 'track count: %d' % len(self.p1))if self.use_ransac:draw_str(vis, (20, 40), 'RANSAC')else:# 初始化特征點(并繪制為綠色的點)p = cv2.goodFeaturesToTrack(frame_gray, **feature_params)if p is not None:for x, y in p[:, 0]:cv2.circle(vis, (x, y), 2, green, -1)draw_str(vis, (20, 20), 'feature count: %d' % len(p))cv2.imshow('lk_homography', vis)if (num == 0):cv2.waitKey(0)if (num % 5 == 0):cv2.imwrite('lk_himgs/' + str(num) + ".jpg", imutils.resize(vis, width=500))num = num + 1ch = cv2.waitKey(1)if ch == 27:breakif ch == ord(' '):self.frame0 = frame.copy()# 初始化特征點self.p0 = cv2.goodFeaturesToTrack(frame_gray, **feature_params)if self.p0 is not None:self.p1 = self.p0self.gray0 = frame_grayself.gray1 = frame_grayif ch == ord('r'):self.use_ransac = not self.use_ransacdef main():import systry:video_src = sys.argv[1]except:video_src = 0App(video_src).run()print('Done')if __name__ == '__main__':print(__doc__)main()cv2.destroyAllWindows()
參考
- https://github.com/opencv/opencv/blob/master/samples/python/lk_homography.py
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html#lucas-kanade
總結
以上是生活随笔為你收集整理的详解OpenCV中的Lucas Kanade稀疏光流单应追踪器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matplitlib绘图入门1,这一篇就
- 下一篇: Windows安装用于OCR的Tesse