ROS_OpenCV2_MatchTemplate模板匹配
来源:互联网 发布:人工智能与人类智慧 编辑:程序博客网 时间:2024/05/22 01:06
给一张图片,在视野中找到。获取物体的二维坐标。语音相关的话题注释掉了。
//给一个物体,在视野中查找#include <ros/ros.h> #include <image_transport/image_transport.h> #include <cv_bridge/cv_bridge.h> #include <sensor_msgs/image_encodings.h> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/opencv.hpp> #include <iostream> #include<string> #include <sstream> #include <opencv2/highgui/highgui.hpp> #include "opencv2/video/tracking.hpp" #include <geometry_msgs/Twist.h> #include <std_msgs/Float32.h> #include <std_msgs/UInt8.h> using namespace cv; using namespace std; //Store all constants for image encodings in the enc namespace to be used later. namespace enc = sensor_msgs::image_encodings; stringstream sss; static string ImgInfo="/home/hsn/catkin_ws/src/rosopencv/1.jpg";//如果用语音把1.jpg去掉void MTemplate(Mat src);/////////////////////////////////////////////////////从语音获取图像的名字。/*void imgInfoCallback(const std_msgs::String::ConstPtr & msg) { ROS_INFO("From SPEECH, I heard: [%s]",msg->data.c_str()); sss.clear(); sss<<ImgInfo; sss<<msg->data.c_str(); sss<<".jpg"; sss>>ImgInfo; } *///This function is called everytime a new image is published void imageCallback(const sensor_msgs::ImageConstPtr& original_image) { //Convert from the ROS image message to a CvImage suitable for working with OpenCV for processing cv_bridge::CvImagePtr cv_ptr; try { //Always copy, returning a mutable CvImage //OpenCV expects color images to use BGR channel order. cv_ptr = cv_bridge::toCvCopy(original_image, enc::BGR8); } catch (cv_bridge::Exception& e) { //if there is an error during conversion, display it ROS_ERROR("tutorialROSOpenCV::main.cpp::cv_bridge exception: %s", e.what()); return; } MTemplate(cv_ptr->image); } void MTemplate(Mat src){ Mat templ; Mat result; int match_method=0; templ=imread(ImgInfo,1); int result_cols = src.cols - templ.cols + 1; int result_rows = src.rows - templ.rows + 1; result.create( result_cols, result_rows, CV_32FC1 ); matchTemplate( src, templ, result, match_method ); normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); /// 通过函数 minMaxLoc 定位最匹配的位置 double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); /// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好 if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ) { matchLoc = minLoc; } else { matchLoc = maxLoc; } /// 最终结果 rectangle( src, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); cout<<"目标的中心坐标 ( "<<matchLoc.x + templ.cols/2<<" , ("<<matchLoc.y + templ.rows<<" )"<<endl; imshow("当前视频",src); imshow("视频",result); waitKey(1);}/** * This is ROS node to track the destination image */ int main(int argc, char **argv) { ros::init(argc, argv, "image_processor"); ROS_INFO("-----------------"); ros::NodeHandle nh; //Create an ImageTransport instance, initializing it with our NodeHandle. image_transport::ImageTransport it(nh); //OpenCV HighGUI call to create a display window on start-up. namedWindow( "CamShift Demo", 0 ); image_transport::Subscriber sub = it.subscribe("camera/rgb/image_raw", 1, imageCallback);/////////////////////////////////////////////////////////////////////////////////ros::Subscriber imgInfo = nh.subscribe("final_recognizer_begin", 1, imgInfoCallback);//接收来自语音部分的话题 destroyWindow("CamShift Demo"); /** * In this application all user callbacks will be called from within the ros::spin() call. * ros::spin() will not return until the node has been shutdown, either through a call * to ros::shutdown() or a Ctrl-C. */ ros::spin(); //ROS_INFO is the replacement for printf/cout. ROS_INFO("tutorialROSOpenCV::main.cpp::No error."); }
0 0
- ROS_OpenCV2_MatchTemplate模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- 模板匹配
- BZOJ_P1529 [POI2005]ska Piggy banks(并查集)
- C++作业2
- Java实现给图片添加水印
- 中文 iOS/Mac 开发博客列表
- bitmap heap scan
- ROS_OpenCV2_MatchTemplate模板匹配
- 加密算法类型
- leetcode 38. Count and Say
- 17 对象的使用(二)
- 网络规划的需求分析
- mysql数据库命令
- C++对C语言的扩展
- [bzoj2594][WC2006]水管局长数据加强版
- nyoj1058 部分和问题