<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          我竟然用OpenCV實(shí)現(xiàn)了卡爾曼濾波

          共 7672字,需瀏覽 16分鐘

           ·

          2021-09-19 07:02

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          本文轉(zhuǎn)載自:OpenCV學(xué)堂(CVSCHOOL)

          卡爾曼濾波原理


          卡爾曼濾波最早可以追溯到Wiener濾波,不同的是卡爾曼采用狀態(tài)空間來描述它的濾波器,卡爾曼濾波器同時(shí)具有模糊/平滑與預(yù)測功能,特別是后者在視頻分析與對象跟蹤應(yīng)用場景中被發(fā)揚(yáng)光大,在離散空間(圖像或者視頻幀)使用卡爾曼濾波器相對簡單。假設(shè)我們根據(jù)一個(gè)處理想知道一個(gè)變量值如下:

          最終卡爾曼濾波完整的評估與空間預(yù)測模型工作流程如下:

          OpenCV API


          cv::KalmanFilter::KalmanFilter(
              int dynamParams, 
              int measureParams,
              int controlParams = 0,
              int type = CV_32F 
          )
          # dynamParams表示state的維度
          # measureParams表示測量維度
          # controlParams表示控制向量
          # type表示創(chuàng)建的matrices


          代碼演示


          import cv2
          from math import cossinsqrt
          import numpy as np

          if __name__ == "__main__":

              img_height = 500
              img_width = 500
              kalman = cv2.KalmanFilter(210)

              cv2.namedWindow("Kalman", cv2.WINDOW_AUTOSIZE)

              while True:
                  state = 0.1 * np.random.randn(21)

                  # 初始化
                  kalman.transitionMatrix = np.array([[1., 1.], [0., 1.]])
                  kalman.measurementMatrix = 1. * np.ones((12))
                  kalman.processNoiseCov = 1e-5 * np.eye(2)
                  kalman.measurementNoiseCov = 1e-1 * np.ones((11))
                  kalman.errorCovPost = 1. * np.ones((22))
                  kalman.statePost = 0.1 * np.random.randn(21)

                  while True:
                      def calc_point(angle):
                          return (np.around(img_width/2 + img_width/3*cos(angle), 0).astype(int),
                                  np.around(img_height/2 - img_width/3*sin(angle), 1).astype(int))

                      state_angle = state[00]
                      state_pt = calc_point(state_angle)
                      # 預(yù)測
                      prediction = kalman.predict()
                      predict_angle = prediction[00]
                      predict_pt = calc_point(predict_angle)

                      measurement = kalman.measurementNoiseCov * np.random.randn(11)

                      # 生成測量
                      measurement = np.dot(kalman.measurementMatrix, state) + measurement
                      measurement_angle = measurement[00]
                      measurement_pt = calc_point(measurement_angle)

                      # plot points
                      def draw_cross(center, color, d):
                          cv2.line(img,
                                   (center[0] - d, center[1] - d), (center[0] + d, center[1] + d),
                                   color, 1, cv2.LINE_AA, 0)
                          cv2.line(img,
                                   (center[0] + d, center[1] - d), (center[0] - d, center[1] + d),
                                   color, 1, cv2.LINE_AA, 0)

                      img = np.zeros((img_height, img_width, 3), np.uint8)

                      cv2.line(img, state_pt, measurement_pt, (00255), 3, cv2.LINE_AA, 0)
                      cv2.line(img, state_pt, predict_pt, (25500), 3, cv2.LINE_AA, 0)

                      # 校正預(yù)測與測量值差異
                      kalman.correct(measurement)

                      # 更新noise矩陣與狀態(tài)
                      process_noise = sqrt(kalman.processNoiseCov[0,0]) * np.random.randn(21)
                      state = np.dot(kalman.transitionMatrix, state) + process_noise

                      cv2.imshow("Kalman", img)

                      code = cv2.waitKey(100)
                      if code != -1:
                          break

                  if code in [27ord('q'), ord('Q')]:
                      break

              cv2.destroyWindow("Kalman")


          好消息,小白學(xué)視覺團(tuán)隊(duì)的知識星球開通啦,為了感謝大家的支持與厚愛,團(tuán)隊(duì)決定將價(jià)值149元的知識星球現(xiàn)時(shí)免費(fèi)加入。各位小伙伴們要抓住機(jī)會哦!


          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~



          瀏覽 63
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91亚洲视频 | 男人的天堂网站视频 | 天天操夜夜操狠狠 | 枕瑶钗十三回兴云弄雨又春风 | 超碰在线大香蕉 172.86.93.25 |