最近看完了Opencv By Example这本书,感觉里面的案例很不错,其中有个案例是通过背景差分识别桌子上的螺钉螺母等机械零件,这对后期的机械臂视觉抓取提供了视觉处理部分的方法论,虽然有很多现成的ROS库可用于视觉抓取工作,但是都略显复杂,对传感器的要求也较高,所以想尝试使用opencv先进行简单处理。方向有了,接下来首要解决的问题当然就是ROS和Opencv结合。
ROS在安装的过程中就已经集成了Opencv3.0以上的版本,所以安装配置几乎不需要咱ROS用户过多考虑,ROS虽然无法直接进行图像处理,但是提供的cv_bridge可以完美转换和被转换图像数据格式。
但即使如此,想要完整的将opencv的项目移植到ROS项目中,也需要费一点功夫,接下来我会将Opencv By Example书中的代码转换成ROS中可用的程序,提供CMake和package.xml配置情况。
创建ROS包命名为redwall_arm_vision,里面只有三个文件,src目录和CMakeList.txt、package.xml,在src目录添加一张图片用于接下来的处理,我用的是大家非常熟悉的 lena.jpg:
在添加一个cpp文件,就命名为main.cpp把,程序内容如下:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
// OpenCV includes
#include <opencv2/video.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
int main( int argc, char** argv )
{
int sample;
cout << "请输入0~7:" << endl;
cin>>sample;
switch(sample){
case 0:
{
cout << "Sample 0, Mat zeros" << endl;
Mat m= Mat::zeros(5,5, CV_32F);
cout &l