zoukankan      html  css  js  c++  java
  • 使用GoodFeaturesToTrack进行关键点检测---29

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/

    关键点:是多个方向上亮度变化强的区域。

    opencv:版本是2.4.

    侦测器:opencv有大量的关键点侦测器,我们本次采用goodFeaturesToTrack()。

    相应的启动文件为:good_features.launch

    侦测器返回的关键点变量:

        maxCorners : 设置最多返回的关键点数量。
        qualityLevel : 反应一个像素点强度有多强才能成为关键点。

        minDistance : 关键点之间的最少像素点。
        blockSize : 计算一个像素点是否为关键点时所取的区域大小。
        useHarrisDetector :使用原声的 Harris 角侦测器或最小特征值标准。
        k : 一个用在Harris侦测器中的自由变量。

    首先确保你的kinect驱动或者uvc相机驱动能正常启动:(如果你使用的是kinect,请运行openni驱动)

    roslaunch openni_launch openni.launch

      如果你没有安装kinect深度相机驱动,请看我前面的博文。

    然后运行下面的launch文件:

    roslaunch rbx1_vision good_features.launch

    当视频出现时,通过鼠标画矩形将图像中的某个对象框住。这个矩形表示所选的区域,你会看到这个区域中会出现一些绿色的小圆点,他们是goodFeaturesToTrack()。侦测器在该区域中发现的关键点,

    以下是我的运行结果:

    下面我们看看代码,主要是good_features.py脚本。

    #!/usr/bin/env python
    
    """ good_features.py - Version 1.1 2013-12-20
        Locate the Good Features To Track in a video stream.
        
        Created for the Pi Robot Project: http://www.pirobot.org
        Copyright (c) 2011 Patrick Goebel.  All rights reserved.
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation; either version 2 of the License, or
        (at your option) any later version.
        
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details at:
        
        http://www.gnu.org/licenses/gpl.html
    """
    
    import rospy
    import cv2
    import cv2.cv as cv
    from rbx1_vision.ros2opencv2 import ROS2OpenCV2
    import numpy as np
    
    class GoodFeatures(ROS2OpenCV2):
        def __init__(self, node_name): 
            super(GoodFeatures, self).__init__(node_name)
              
            # Do we show text on the display?
            self.show_text = rospy.get_param("~show_text", True)
            
            # How big should the feature points be (in pixels)?
            self.feature_size = rospy.get_param("~feature_size", 1)
            
            # Good features parameters
            self.gf_maxCorners = rospy.get_param("~gf_maxCorners", 200)
            self.gf_qualityLevel = rospy.get_param("~gf_qualityLevel", 0.02)
            self.gf_minDistance = rospy.get_param("~gf_minDistance", 7)
            self.gf_blockSize = rospy.get_param("~gf_blockSize", 10)
            self.gf_useHarrisDetector = rospy.get_param("~gf_useHarrisDetector", True)
            self.gf_k = rospy.get_param("~gf_k", 0.04)
            
            # Store all parameters together for passing to the detector
            self.gf_params = dict(maxCorners = self.gf_maxCorners, 
                           qualityLevel = self.gf_qualityLevel,
                           minDistance = self.gf_minDistance,
                           blockSize = self.gf_blockSize,
                           useHarrisDetector = self.gf_useHarrisDetector,
                           k = self.gf_k)
    
            # Initialize key variables
            self.keypoints = list()
            self.detect_box = None
            self.mask = None
            
        def process_image(self, cv_image):
            try:
                # If the user has not selected a region, just return the image
                if not self.detect_box:
                    return cv_image
        
                # Create a greyscale version of the image
                grey = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
                
                # Equalize the histogram to reduce lighting effects
                grey = cv2.equalizeHist(grey)
        
                # Get the good feature keypoints in the selected region
                keypoints = self.get_keypoints(grey, self.detect_box)
                
                # If we have points, display them
                if keypoints is not None and len(keypoints) > 0:
                    for x, y in keypoints:
                        cv2.circle(self.marker_image, (x, y), self.feature_size, (0, 255, 0, 0), cv.CV_FILLED, 8, 0)
                
                # Process any special keyboard commands
                if self.keystroke != -1:
                    try:
                        cc = chr(self.keystroke & 255).lower()
                        if cc == 'c':
                            # Clear the current keypoints
                            keypoints = list()
                            self.detect_box = None
                    except:
                        pass
            except:
                pass
                                    
            return cv_image
    
        def get_keypoints(self, input_image, detect_box):
            # Initialize the mask with all black pixels
            self.mask = np.zeros_like(input_image)
     
            # Get the coordinates and dimensions of the detect_box
            try:
                x, y, w, h = detect_box
            except: 
                return None
            
            # Set the selected rectangle within the mask to white
            self.mask[y:y+h, x:x+w] = 255
    
            # Compute the good feature keypoints within the selected region
            keypoints = list()
            kp = cv2.goodFeaturesToTrack(input_image, mask = self.mask, **self.gf_params)
            if kp is not None and len(kp) > 0:
                for x, y in np.float32(kp).reshape(-1, 2):
                    keypoints.append((x, y))
                    
            return keypoints
    
    if __name__ == '__main__':
        try:
            node_name = "good_features"
            GoodFeatures(node_name)
            rospy.spin()
        except KeyboardInterrupt:
            print "Shutting down the Good Features node."
            cv.DestroyAllWindows()
  • 相关阅读:
    免费录屏工具
    树莓派4安装mysql
    python中,print、变量、赋值详细理解篇01
    mysql db [Warning] IP address 'xxxx' could not be resolved: Name or service not known
    添加脚本命令
    LRUCache实现方案
    HTTP/2做错了什么?刚刚辉煌2年就要被弃用了!?
    TS 中的 export declare interface 和 export interface 到底有什么不同?
    使用nexus搭建npm私服
    nodejs 安装
  • 原文地址:https://www.cnblogs.com/zxouxuewei/p/5409924.html
Copyright © 2011-2022 走看看