基于opencv特征点提取
因为最近想做图像处理、人脸检测/识别之类的相关开发,所以就开始补OpenCV的相关知识,便开个专栏用于记录学习历程和在学习过程。
在进行图片处理或者slam建图中,我们常常需要提取图像的特征点。图片的特征提取是深度学习中最为基础也是最为重要的研究问题,特征提取可以简单的看作一个数据降维过程,特征提取过程即是将图片数据转化为具有一定区分度的一定维度的向量的图片特征的过程。 利用图像特征进行图片运算,明显降低了存储和计算复杂度。
实现流程需要先订阅ros摄像头信息,用opencv内置函数处理,在通过ros节点发布出来,函数的实现原理我没有深究,有兴趣的同学可以自行查阅。一下是代码实现:
//ROSFAST特征点提取
#include "ros/ros.h"
#include "sensor_msgs/Image.h"
#include "cv_bridge/cv_bridge.h"
#include "sensor_msgs/image_encodings.h"
#include <iostream>
#include <string>
#include <vector>
#include <opencv2/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace std;
ros::Publisher fast_pub;
void callback_rgb(const sensor_msgs::ImageConstPtr image_rgb_in){
cv_bridge::CvImagePtr image_msg_bridge;
image_msg_bridge = cv_bridge::toCvCopy(image_rgb_in,sensor_msgs::image_encodings::BGR8);
cv::Mat image_cv = image_msg_bridge->image;
cv::Ptr<cv::FastFeatureDetector> detector = cv::FastFeatureDetector::create(60);
vector<cv::KeyPoint> keypoints;
detector->detect(image_cv,keypoints);
cv::Mat image_fast;
cv::drawKeypoints(image_cv, keypoints, image_fast);
sensor_msgs::ImagePtr fast_msg = cv_bridge::CvImage(std_msgs::Header(),"bgr8",image_fast).toImageMsg();
fast_pub.publish(*fast_msg);
}
int main(int argc, char *argv[]){
ros::init(argc,argv,"rosFast");
ros::NodeHandle nh;
fast_pub = nh.advertise<sensor_msgs::Image>("/fast_result", 10);
ros::Subscriber sub_rgb = nh.subscribe("/camera/color/image_raw", 10, callback_rgb);
ros::spin();
return 0;
}
cmakelist配置文件在这篇博客中: