精华内容
下载资源
问答
  • Python OpenCV 物体识别

    千次阅读 2020-03-15 11:41:15
    基于Python OpenCV 隐马尔可夫模型 物体识别,汽车飞机摩托车。 网上自己收集的图片进行识别的,准确率可以达到60% 其中通过star 和sift 特征检测。 import os import warnings import numpy as np import cv2 as cv...

    基于Python OpenCV 隐马尔可夫模型 物体识别,汽车飞机摩托车。

    网上自己收集的图片进行识别的,准确率可以达到60% 其中通过star 和sift 特征检测。

    SIFT算法

    来源:
    尺度不变特征转换(Scale-invariant feature transform或SIFT)算法是一种特征提取的方法。它在尺度空间中寻找极值点,并提取出其位置、尺度、旋转不变量,并以此作为特征点并利用特征点的邻域产生特征向量。SIFT算法对于光线、噪声、和微小视角改变的容忍度相当高,且对于部分遮挡的物体也有较高的识别相率。
    SIFT算法适合于识别旋转度达60度的平面形状,或是旋转度达到20度的三维物体。
    SIFT算法对模糊的图像和边缘平滑的图像,检测出的特征点过少,对圆更是无能为力

    import os
    import warnings
    import numpy as np
    import cv2 as cv
    
    import hmmlearn.hmm as hl
    
    warnings.filterwarnings('ignore',category=DeprecationWarning)
    
    np.seterr(all='ignore')
    
    
    def search_objects(directory):
        directory = os.path.normpath(directory)
        if not os.path.isdir(directory):
            raise IOError("the directory '"+ directory + \
                          "' doesn't exist")
        objects ={}
        for curdir ,subdirs, files in os.walk(directory):
            for jpeg in (file for file in files if file.endswith('.jpg')):
                path = os.path.join(curdir,jpeg)
                label = path.split(os.path.sep)[-2]
                if label not in objects:
                    objects[label]=[]
                objects[label].append(path)
        return objects
    
    
    train_objects=search_objects('data/objects/training')
    print(train_objects)
    
    train_x, train_y =[],[]
    for label, filenames in train_objects.items():
        descs = np.array([])
        for filename in filenames:
            image = cv.imread(filename)
            gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    
            #调整大小
            h,w =gray.shape[:2]
            f =200/min(h,w)
            gray = cv.resize(gray,None,fx=f,fy=f)
            star=cv.xfeatures2d.StarDetector_create()
            keypoints = star.detect(gray)
            sift = cv.xfeatures2d.SIFT_create()
    
            _,desc = sift.compute(gray,keypoints)
            if len(descs)==0:
                descs=desc
            else:
                descs=np.append(descs,desc,axis=0)
        train_x.append(descs)
        train_y.append(label)
    models={}
    for descs, label in zip(train_x,train_y):
        model= hl.GaussianHMM(n_components=4,
                              covariance_type='diag',
                              n_iter=1000
                               )
        models[label]=model.fit(descs)
    
    test_objects=search_objects('data/objects/testing')
    print(train_objects)
    
    test_x, test_y, test_z=[],[],[]
    for label, filenames in test_objects.items():
        test_z.append([])
        descs = np.array([])
        for filename in filenames:
            image = cv.imread(filename)
            test_z[-1].append(image)
    
            gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    
            #调整大小
            h,w =gray.shape[:2]
            f =200/min(h,w)
            gray = cv.resize(gray,None,fx=f,fy=f)
            star=cv.xfeatures2d.StarDetector_create()
            keypoints = star.detect(gray)
            sift = cv.xfeatures2d.SIFT_create()
    
            _,desc = sift.compute(gray,keypoints)
            if len(descs)==0:
                descs=desc
            else:
                descs=np.append(descs,desc,axis=0)
        test_x.append(descs)
        test_y.append(label)
    pred_test_y=[]
    for descs in test_x:
        best_score, best_label =None,None
        for label, model in models.items():
            score=model.score(descs)
            if(best_score is None)or(best_score<score):
                best_score, best_label = score,label
        pred_test_y.append(best_label)
    i=0
    for label,pred_label,images in zip(test_y,pred_test_y,test_z):
        for image in images:
            i+=1
            cv.imshow("{}-{} {} {}".format(i,label,'=='
                       if label == pred_label else '!=',pred_label),image)
    
    cv.waitKey()
    
    展开全文
  • 红绿灯识别 opencv 运动物体识别 红绿灯识别 opencv 运动物体识别 红绿灯识别 opencv 运动物体识别 红绿灯识别 opencv 运动物体识别
  • OpenCV.物体识别

    千次阅读 2019-07-05 10:05:00
    1、度娘:“OpenCV 物体识别”  1.1、opencv实时识别指定物体 - 诺花雨的博客 - CSDN博客.html(https://blog.csdn.net/qq_27063119/article/details/79247266)  ZC:主看这个,讲的比较细致,操作一般都是使用...

    1、度娘:“OpenCV 物体识别”

     1.1、opencv实时识别指定物体 - 诺花雨的博客 - CSDN博客.html(https://blog.csdn.net/qq_27063119/article/details/79247266

      ZC:主看这个,讲的比较细致,操作一般都是使用的 OpenCV里面的exe,一些代码是 java的 可以搞定,最后一段测试代码 是Python 但是比较短 应该可以转成C++的来测试。

      ZC:照着做了,还需研究

     1.2、利用深度学习和OpenCV实现物体检测 - 简书.html(https://www.jianshu.com/p/e9a6c1eac2c9

     

    2、级联分类器训练 — OpenCV 2.3.2 documentation.html(http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html

    3、

    4、

    5、

    6、

    7、人脸

     7.1、OpenCV人脸识别之三:识别自己的脸 - 简书.html(https://www.jianshu.com/p/0514c03e6727)  ZC:里面有讲到训练,不过不在这篇文章里,有链接的

     7.2、基于OpenCV3实现人脸识别(实践篇) - qq_37791134的博客 - CSDN博客.html(https://blog.csdn.net/qq_37791134/article/details/81385848

      ZC:貌似 粗看了下 值得跟着做

    8、Haar分类器

     8.1、OpenCV Haar分类器人脸检测部分代码注释_文档库.html(http://www.wendangku.net/doc/b463746325c52cc58bd6be2c.html

     8.2、如何提高opencv 人脸识别准确_百度知道.html(https://zhidao.baidu.com/question/1707927401038203100.html

     8.3、OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理 - emouse - 博客园.html(https://www.cnblogs.com/emouse/archive/2013/04/23/3037234.html

     8.4、OpenCV——级联分类器(CascadeClassifier) - Not-Bad - 博客园.html(https://www.cnblogs.com/farewell-farewell/p/5945412.html

     8.5、正式使用opencv里的训练和检测 - opencv_createsamples、opencv_traincascade-2.4.11版本 - 逍遥.安——于安静和黑暗中寻找最亮丽的风景 - CSDN博客.html(https://blog.csdn.net/wuxiaoyao12/article/details/39227189

      ZC:没细看,这讲的是 哪种训练?还是两种都有?

     8.6、opencv_data_haarcascades at master · opencv_opencv · GitHub.html(https://github.com/opencv/opencv/tree/master/data/haarcascades

      ZC:一些 已经训练好的 haar分类器的文件

    9、

    10、

     

    转载于:https://www.cnblogs.com/cppskill/p/11136601.html

    展开全文
  • ROS+OpenCV 人脸识别,物体识别

    千次阅读 2020-06-13 13:55:53
    人脸识别 1.环境准备 首先准备ROS系统,基于ros的软件支持opencv,usbcam apt install ros-kinetic-desktop-full apt install ros-kinetic-opencv3 apt install ros-kinetic-usb-cam 2.创建工作空间与功能包 ...

    目录

     

    人脸识别

    1.环境准备

    2.创建工作空间与功能包

    3.人脸识别程序

    4.launch文件

    5.执行

    物体追踪 


    人脸识别

    1.环境准备

    首先准备ROS系统,基于ros的软件支持opencv,usbcam

    apt install ros-kinetic-desktop-full

    apt install ros-kinetic-opencv3

    apt install ros-kinetic-usb-cam

    2.创建工作空间与功能包

    在创建功能包时导入依赖库

    $ source /opt/ros/kinetic/setup.zsh
    $ mkdir -p ~/catkin_ws/src
    $ cd ~/catkin_ws/src
    $ catkin_init_workspace
    $ cd ~/catkin_ws
    $ catkin_make 
    $ souce ~/catkiin_ws/devel/setup.zsh
    $ cd ~/catkin_ws/src
    $ catkin_create_pkg test1 rospy roscpp std_msgs sensor_msgs cv_bridge image_transport 
    $ cd ~/catkin_ws
    $ catkin_make
    $ source devel/setup.zsh
    

    创建文件目录结构

    scripts存放代码,launch存放启动文件

    $cd test2
    $mkdir launch scripts
    

     

    3.人脸识别程序

    $cd test2/scripts

    $touch face_detector.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import rospy
    import cv2
    import numpy as np
    from sensor_msgs.msg import Image, RegionOfInterest
    from cv_bridge import CvBridge, CvBridgeError
    
    class faceDetector:
        def __init__(self):
            rospy.on_shutdown(self.cleanup);
    
            # 创建cv_bridge
            self.bridge = CvBridge()
            self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
    
            # 获取haar特征的级联表的XML文件,文件路径在launch文件中传入
            cascade_1 = rospy.get_param("~cascade_1", "")
            cascade_2 = rospy.get_param("~cascade_2", "")
    
            # 使用级联表初始化haar特征检测器
            self.cascade_1 = cv2.CascadeClassifier(cascade_1)
            self.cascade_2 = cv2.CascadeClassifier(cascade_2)
    
            # 设置级联表的参数,优化人脸识别,可以在launch文件中重新配置
            self.haar_scaleFactor  = rospy.get_param("~haar_scaleFactor", 1.2)
            self.haar_minNeighbors = rospy.get_param("~haar_minNeighbors", 2)
            self.haar_minSize      = rospy.get_param("~haar_minSize", 40)
            self.haar_maxSize      = rospy.get_param("~haar_maxSize", 60)
            self.color = (50, 255, 50)
    
            # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
            self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)
    
        def image_callback(self, data):
            # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
            try:
                cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")     
                frame = np.array(cv_image, dtype=np.uint8)
            except CvBridgeError, e:
                print e
    
            # 创建灰度图像
            grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
            # 创建平衡直方图,减少光线影响
            grey_image = cv2.equalizeHist(grey_image)
    
            # 尝试检测人脸
            faces_result = self.detect_face(grey_image)
    
            # 在opencv的窗口中框出所有人脸区域
            if len(faces_result)>0:
                for face in faces_result: 
                    x, y, w, h = face
                    cv2.rectangle(cv_image, (x, y), (x+w, y+h), self.color, 2)
    
            # 将识别后的图像转换成ROS消息并发布
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
    
        def detect_face(self, input_image):
            # 首先匹配正面人脸的模型
            if self.cascade_1:
                faces = self.cascade_1.detectMultiScale(input_image, 
                        self.haar_scaleFactor, 
                        self.haar_minNeighbors, 
                        cv2.CASCADE_SCALE_IMAGE, 
                        (self.haar_minSize, self.haar_maxSize))
                                             
            # 如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型
            if len(faces) == 0 and self.cascade_2:
                faces = self.cascade_2.detectMultiScale(input_image, 
                        self.haar_scaleFactor, 
                        self.haar_minNeighbors, 
                        cv2.CASCADE_SCALE_IMAGE, 
                        (self.haar_minSize, self.haar_maxSize))
            
            return faces
    
        def cleanup(self):
            print "Shutting down vision node."
            cv2.destroyAllWindows()
    
    if __name__ == '__main__':
        try:
            # 初始化ros节点
            rospy.init_node("face_detector")
            faceDetector()
            rospy.loginfo("Face detector is started..")
            rospy.loginfo("Please subscribe the ROS image.")
            rospy.spin()
        except KeyboardInterrupt:
            print "Shutting down face detector node."
            cv2.destroyAllWindows()

     

    4.launch文件

    $cd test2/launch

    $touch usb_cam.launch face_detector.launch

    usb_cam.launch开启摄像头

    <launch>
    
      <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
        <param name="video_device" value="/dev/video0" />
        <param name="image_width" value="640" />
        <param name="image_height" value="480" />
        <param name="pixel_format" value="yuyv" />
        <param name="camera_frame_id" value="usb_cam" />
        <param name="io_method" value="mmap"/>
      </node>
    
    </launch>

    face_detector.launch运行人脸识别程序 

    <launch>
        <node pkg="test2" name="face_detector" type="face_detector.py" output="screen">
            <remap from="input_rgb_image" to="/usb_cam/image_raw" />
            <rosparam>
                haar_scaleFactor: 1.2
                haar_minNeighbors: 2
                haar_minSize: 40
                haar_maxSize: 60
            </rosparam>
            <param name="cascade_1" value="$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml" />
            <param name="cascade_2" value="$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml" />
        </node>
    </launch>

     

    5.执行

    分别开启三个终端,执行以下命令

    $roslaunch test2 usb_cam.launch

    $roslaunch test2 face_detector.launch

    $rqt_image_view //也可用rviz订阅

    正面效果 

    侧面效果

     

    物体追踪 

    程序如下,使用方式同人脸识别,在scripts目录放入程序,在launch目录放入launch文件

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import rospy
    import cv2
    import numpy as np
    from sensor_msgs.msg import Image, RegionOfInterest
    from cv_bridge import CvBridge, CvBridgeError
    
    class motionDetector:
        def __init__(self):
            rospy.on_shutdown(self.cleanup);
    
            # 创建cv_bridge
            self.bridge = CvBridge()
            self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
    
            # 设置参数:最小区域、阈值
            self.minArea   = rospy.get_param("~minArea",   500)
            self.threshold = rospy.get_param("~threshold", 25)
    
            self.firstFrame = None
            self.text = "Unoccupied"
    
            # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
            self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)
    
        def image_callback(self, data):
            # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
            try:
                cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")     
                frame = np.array(cv_image, dtype=np.uint8)
            except CvBridgeError, e:
                print e
    
            # 创建灰度图像
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            gray = cv2.GaussianBlur(gray, (21, 21), 0)
    
            # 使用两帧图像做比较,检测移动物体的区域
            if self.firstFrame is None:
                self.firstFrame = gray
                return  
            frameDelta = cv2.absdiff(self.firstFrame, gray)
            thresh = cv2.threshold(frameDelta, self.threshold, 255, cv2.THRESH_BINARY)[1]
    
            thresh = cv2.dilate(thresh, None, iterations=2)
            binary, cnts, hierarchy= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
            for c in cnts:
                # 如果检测到的区域小于设置值,则忽略
                if cv2.contourArea(c) < self.minArea:
                   continue 
    
                # 在输出画面上框出识别到的物体
                (x, y, w, h) = cv2.boundingRect(c)
                cv2.rectangle(frame, (x, y), (x + w, y + h), (50, 255, 50), 2)
                self.text = "Occupied"
    
            # 在输出画面上打当前状态和时间戳信息
            cv2.putText(frame, "Status: {}".format(self.text), (10, 20),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
    
            # 将识别后的图像转换成ROS消息并发布
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(frame, "bgr8"))
    
        def cleanup(self):
            print "Shutting down vision node."
            cv2.destroyAllWindows()
    
    if __name__ == '__main__':
        try:
            # 初始化ros节点
            rospy.init_node("motion_detector")
            rospy.loginfo("motion_detector node is started...")
            rospy.loginfo("Please subscribe the ROS image.")
            motionDetector()
            rospy.spin()
        except KeyboardInterrupt:
            print "Shutting down motion detector node."
            cv2.destroyAllWindows()
    

    launch

    <launch>
        <node pkg="test2" name="motion_detector" type="motion_detector.py" output="screen">
            <remap from="input_rgb_image" to="/usb_cam/image_raw" />
            <rosparam>
                minArea: 500
                threshold: 25
            </rosparam>
        </node>
    </launch>

    执行效果

    被识别出的物体有篮球,柜子,手臂,衣袖,被识别物体用边框圈出

    展开全文
  • opencv实时识别指定物体

    热门讨论 2018-02-03 16:46:41
    opencv实时识别指定物体,所有需要的用到的文件都已经放上了,opencv 3.4.0 python 3.6.3
  • 实现目标利用USB摄像头对拍摄的物体进行轮廓识别并标识显示打开pycharm开发工具,在项目中新建 demo.py 文件,文件代码如下:# 调用对应的库import cv2# 视频参数设置cap = cv2.VideoCapture(0)while True:# 读取...

    实现目标

    利用USB摄像头对拍摄的物体进行轮廓识别并标识显示

    打开pycharm开发工具,在项目中新建 demo.py 文件,文件代码如下:

    # 调用对应的库

    import cv2

    # 视频参数设置

    cap = cv2.VideoCapture(0)

    while True:

    # 读取视频

    ret, frame = cap.read()

    # 必须先转化成灰度图

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 阈值设置

    thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY)[1]

    # 寻找轮廓

    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    # 画出轮廓,-1,表示所有轮廓,颜色为(0, 255, 0),即Green,粗细为2

    cv2.drawContours(frame, contours, -1, (0, 255, 0), 2)

    # 弹出显示视频

    cv2.imshow('Capture', frame)

    # Q键退出

    if cv2.waitKey(1) & 0xFF == ord('q'):

    break

    cap.release()

    cv2.destroyAllWindows()

    运行结果如下:

    79b976f60822c7462ea901734f9671d4a6999434.png

    展开全文
  • Python+OpenCV颜色识别 物体追踪

    千次阅读 2021-02-13 22:57:20
    Python+OpenCV颜色识别 物体追踪 对于颜色识别和imutils包的用法请浏览我得另一篇博客:OpenCV学习笔记 文章目录Python+OpenCV颜色识别 物体追踪代码原理代码最终效果图 代码原理 这是个比较简单的代码。代码实现的...
  • 基于opencv物体识别

    千次阅读 2019-09-18 12:01:11
    具体来说,OpenCV实现的Cascade(级联)分类器就是基于多个弱分类器对不同的特征进行依次处理(分类)来完成对目标的检测,每一级都比前一级复杂,简单的说有多个弱分类器串起来,然后提取每个平滑窗上的不同特征,...
  • 利用VS2010和Opencv实现物体的追踪
  • 主要为大家详细介绍了python+opencv实现动态物体识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 手把手教你如何利用Python + opencv opencv实时识别指定(或自定义)物体
  • opencv实时识别

    2019-12-19 09:42:43
    opencv实时识别,可以识别指定物体。有需要的可以下载一下试试。
  • OpenCV动作识别

    2020-03-25 04:35:35
    自己参加比赛的代码分享出来, OpenCV动作识别OpenCV3.0版本,VS2012完美运行 自己参加比赛的代码分享出来, OpenCV动作识别OpenCV3.0版本,VS2012完美运行
  • 演示文章https://blog.csdn.net/weixin_39276851/article/details/119845176
  • 在Linux环境下进行Opencv分类器的训练(基于树莓派和OpenCV物体识别)一、环境配置二、收集和处理样本1、收集正样本2、收集负样本3、正负样本描述文件生成三、训练分类器四、使用生成的xml文件进行识别 ...
  • 人类学习的目的不是识别更多的东西,机器学习也是如此,也就是说,让计算机通过学习类比来学习更多的东西.在这里,我们让计算机知道图像. 要让计算机知道事情,我们必须首先教他. 他了解自然,所以我们准备了许多...
  • 本文将使用opencv-python识别自定义物体,能够区分识别到的物体,如果用作人脸识别,则能够区分出不同的人脸id,也就是能够分得清张三,李四,王二麻子 本文提供的所有资源仅供学习使用,不可商用 文末有完整...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,695
精华内容 5,478
关键字:

opencv物体识别