现在想用OPENCV作运动目标的识别和跟踪,用啥方法最好,最快入门?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了现在想用OPENCV作运动目标的识别和跟踪,用啥方法最好,最快入门?相关的知识,希望对你有一定的参考价值。

我们打算用全局摄像头监控机器人的实时位置,通过传回实时位置位姿来实现机器人下一步运动的决策,看了一下学习OPENCV这本书,发现内容较为复杂,理不出头绪,请高手指点,多谢!

你的意思是:机器人在摄像头监视的范围内运动,用这个摄像头来捕捉该机器人的运动,是吗?
(1)背景中只有机器人这一个物体运动吗?
(2)背景的光线会不会有较大的变化?(例如:晴天,阴天......)
=========================================================
我说两个比较简单的方法吧:
(1)如果背景的光线变化较小且其中只有机器人这一个运动的物体:
a. 单独拍摄一张同角度的背景图片(上无机器人),记为 background.jpg
b. 用这张背景图片 background.jpg 与 摄像机捕捉画面的每一帧图片 “做差”
c. 用一个threshold 滤去“差值”图片上微弱的“噪音”
d. 在对这个“降噪”后的差值图片用 cvFindContours()找到轮廓
e. 用while迭代出每一个轮廓
f. 对每次迭代出的轮廓用 cvBoundingRect() 来获得每个轮廓的外接矩形,记为rect
g. 求出每个矩形的面积,用面积筛选出 “哪个是机器人”
h. 那么这个机器人的位置信息为: rect.x rect.y rect.width rect.height
--------------------------------------------------
(2)如果背景中有多个运动物体,那么:
你给机器人上画一个 “鲜艳一些的矩形” ,然后用OpenCV来找到画面中的所有矩形,然后用过颜色判断来从这些矩形中筛选出“哪个是你的机器人”即可。OpenCV识别矩形的代码,网上有的是,用Google搜一下吧............
=========================================================
Learning OpenCV那本书,中文翻译的太烂,很容易把人弄糊涂,看英文的吧,讲的挺清楚的,另外看那本书,最好不要泛泛的读,那样会很打击人的,因为它讲了很多原理性的东东,如果你不研究算法,只是想实现应用的话,有些对原理的解释可以略读一下。
=========================================================
我留个邮箱,常联系: lzninchina (at) sina 点卡姆
参考技术A 在网上找实例操作!一边看书一边操作。

如何使用python(Opencv)识别头部(面部)运动

【中文标题】如何使用python(Opencv)识别头部(面部)运动【英文标题】:How to recognize head(face) movement using python(Open cv) 【发布时间】:2021-02-18 10:33:02 【问题描述】:

美好的一天,我发现使用 openCV 很难识别人的头部运动,我做了一个项目,使用 haarcascade 分类器检测面部和眼睛,但无法跟踪头部运动,比如头部左右移动, 向上或向下移动。

这是我的代码

if __name__=='__main__':

#initialize the webcam
webcam =cv2.VideoCapture(0)
#capture frame by frame
ret,frame = webcam.read()

#convert image from BGR(OpenCV) to RGB(face_recognition)
frameRGB = frame[:, :, ::-1]
#frameRGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
#array co-ordinate of faces
box = face_recognition.face_locations(frameRGB)

cx_ = (box[0][3] + box[0][1])/2
cy_ = (box[0][3] + box[0][1])/2

cx = cx_
cy = cy_
MIN_MOVE = 10

while True:
    ret,frame = webcam.read()
    
    frameRGB = frame[:, :, ::-1]
    #frameRGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    box = face_recognition.face_locations(frameRGB)
    
    
    if (box != []):
        
        #if the box is not empty do the following
        cx = (box[0][3] + box[0][1])/2
        cy = (box[0][0] + box[0][2])/2
        cv2.rectangle(frame, (box[0][3],box[0][2]), (box[0][1],box[0][0]), (0,0,255), 2)
        
        if abs(cx-cx_) > abs(cy-cy_):
            
            if cx - cx_ > MIN_MOVE:
                print("LEFT")
            elif cx - cx_ < -MIN_MOVE:
                print("RIGHT")
                
        else:
            
            if cy - cy_ > MIN_MOVE:
                print("DOWN")
            elif cy - cy_ < -MIN_MOVE:
                print("UP")
                
    cv2.imshow('Unlock Face', frame)
    key = cv2.waitKey(30)
    cx_ = cx
    cy_ = cy
    
    if key == 27: #press Esc key to exit
        break

【问题讨论】:

我收到此错误 IndexError box = face_recognition.face_locations(frameRGB) cx_ = (box[0][3] + box[0][1])/2 cy_ = (box[0] [3] + box[0][1])/2 IndexError: list index out of range @amirhossein_mlkz 【参考方案1】:

您可以使用 dlib 人脸检测。它使用 Deep CNN,非常好。首先通过以下方式安装 face_recogniton madule:

pip install face-recognition

然后你可以使用下面的代码

import cv2
import numpy as np
import face_recognition

if __name__ =='__main__':

    Camera = cv2.VideoCapture(0)
    _,frame = Camera.read()
            
    frameRGB = cv2.cvtColor ( frame , cv2.COLOR_BGR2RGB )
    box = face_recognition.face_locations(frameRGB)          

    cx_ = (box[0][3] + box[0][1])/2
    cy_ = (box[0][3] + box[0][1])/2
    cx = cx_
    cy = cy_

    MIN_MOVE=10
    while True:
            _,frame = Camera.read()
            
            frameRGB = cv2.cvtColor ( frame , cv2.COLOR_BGR2RGB )
            box = face_recognition.face_locations(frameRGB)          


            if ( box!= [] ):
                    cx = (box[0][3] + box[0][1])/2
                    cy = (box[0][0] + box[0][2])/2
                    cv2.rectangle ( frame ,(box[0][3],box[0][2]) , (box[0][1],box[0][0]) , (0,0,255) , 2 )

                    if abs(cx-cx_) > abs(cy-cy_):
                    #print(cx,cx_, cy, cy_)
                            if cx - cx_ > MIN_MOVE:
                                    print('LEFT')
                            elif cx - cx_ < -MIN_MOVE:
                                    print('RIHT')
                    else:

                            if cy - cy_ > MIN_MOVE:
                                    print('DOWN')
                            elif cy - cy_ < -MIN_MOVE:
                                    print('UP')


            cv2.imshow ( "unlock Face" ,frame )
            key = cv2.waitKey (30)
            cx_ = cx
            cy_ = cy
            if key == 27:
                    break
    

【讨论】:

我收到此错误 IndexError box = face_recognition.face_locations(frameRGB) cx_ = (box[0][3] + box[0][1])/2 cy_ = (box[0] [3] + box[0][1])/2 IndexError: list index out of range

以上是关于现在想用OPENCV作运动目标的识别和跟踪,用啥方法最好,最快入门?的主要内容,如果未能解决你的问题,请参考以下文章

opencv目标跟踪怎么实现重新选择目标

运动目标检测——光流法与opencv代码实现

急!!!opencv做目标跟踪的时候,怎样把目标用矩形圈出来

opencv 目标跟踪一定要把被跟踪的物体圈出来吗?

运动对象检测和描述

opencv 怎么识别出红色物体呀