ROS:OpenCV canny边缘检测

本文介绍了一个使用ROS和OpenCV进行图像处理的C++程序示例,该程序从摄像头捕获图像,应用Canny边缘检测算法,并通过ROS节点发布处理后的图像。文章详细展示了如何在CMakeLists.txt中配置OpenCV和ROS依赖项,以及如何在代码中正确使用命名空间。
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <opencv2/opencv.hpp>
#include <ros/ros.h>
#include <sensor_msgs/image_encodings.h>

using namespace cv;//包含cv命名空间

int main(int argc, char** argv)
{
    ros::init(argc, argv, "canny_proc_node");
    ros::NodeHandle nh;

    cv::VideoCapture capture(0); //0为读取摄像头,“video.format"为读取本地视频
    if (!capture.isOpened()) {
        ROS_ERROR_STREAM("Failed to open video device\n");
        ros::shutdown();
    }

    Mat edges;

    //image_transport负责订阅和发布
    image_transport::ImageTransport it(nh);
    image_transport::Publisher pub_image = it.advertise("canny_proc", 1);

    while (ros::ok()) {
        Mat frame;
        capture >> frame; //载入

        if (frame.empty()) {
            ROS_ERROR_STREAM("Failed to capture image!");
            ros::shutdown();
        }

        cvtColor(frame, edges, CV_BGR2GRAY);
        blur(edges, edges, Size(7, 7));
        Canny(edges, edges, 0, 30, 3);
        //将图像从cv::Mat类型转化成sensor_msgs/Image类型并发布
        pub_image.publish(cv_bridge::CvImage(std_msgs::Header(), "mono8", edges).toImageMsg()); //将图像从sensor_msgs/Image类型转化成cv::Mat类型
        /*
        cv_bridge可以有选择的对颜色和深度信息进行转化。为了使用指定的特征编码,就有下面集中的编码形式:

        mono8:  CV_8UC1, 灰度图像
        mono16: CV_16UC1,16位灰度图像
        bgr8: CV_8UC3,带有颜色信息并且颜色的顺序是BGR顺序
        rgb8: CV_8UC3,带有颜色信息并且颜色的顺序是RGB顺序
        bgra8: CV_8UC4, BGR的彩色图像,并且带alpha通道
        rgba8: CV_8UC4,CV,RGB彩色图像,并且带alpha通道
        */

        imshow("canny", edges);
        waitKey(3); // opencv刷新图像 3ms
    }

    ros::spin();
}

在CMakeLists.txt中添加

find_package(OpenCV REQUIRED)
target_link_libraries(cannyproc
  ${catkin_LIBRARIES}
  ${OpenCV_LIBRARIES}
)

Q:命名空间的使用using namespace cv;
不清楚为什么,在未添加命名空间cv情况下使用cv::blur会编译错误,而添加了上述命名空间的声明后正常。望解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值