ros下读取usb摄像头(15)

读取图像后分辨率设置在640x480,封装到ros节点/camera/image下一30hz发布。

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <iostream>
#include <stdio.h>

// #include <xx_msgs/Flag.h>

// static bool gainControl_flag = false;
// void  gainControlCB(const xx_msgs::Flag::ConstPtr& msg)
// {
//    std::string control_msg = msg->flag;
//    if(control_msg == "3dlidar stop,cv start")
//    {
//       ROS_INFO("ImagePro gain control.");
//       gainControl_flag = true;
//    }
// }

//读取yaml参数
template<typename T>
T getParam(const std::string& name,const T& defaultValue) //This name must be namespace+parameter_name
{
    T v;
    if(ros::param::get(name,v)) //get parameter by name depend on ROS.
    {
        ROS_INFO_STREAM("Found parameter: "<<name<<",\tvalue: "<<v);
        return v;
    }
    else 
        ROS_WARN_STREAM("Cannot find value for parameter: "<<name<<",\tassigning default: "<<defaultValue);
    return defaultValue; //if the parameter haven't been set,it's value will return defaultValue.
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "camera");
  ros::NodeHandle nh;
  image_transport::ImageTransport it(nh);
  image_transport::Publisher pub = it.advertise("camera/image", 1);
  // ros::Subscriber controlFlag_sub = nh.subscribe<xx_msgs::Flag>("flag_3dlidar_to_cv",1,gainControlCB); 
//  std::string video_name = getParam<std::string>("ros_cv/videoname","rtsp://admin:txz123456@192.168.1.66:554/mjpeg/ch1/sub/av_stream");
  // std::string video_name = "rtsp://admin:txz123456@192.168.1.66:554/mjpeg/ch1/sub/av_stream";
  // std::string video_name = "/home/xx/andyoyo/usv_ImagePro/src/ros_cv/data/lib2.avi";
  //int camera_index = 0;
  
  //cv::VideoWriter writer("/home/xx/andyoyo/data/write.avi",CV_FOURCC('M','J','P','G'),30.0,cv::Size(640,480));

  cv::VideoCapture cap(1);
  std::string img_name;
  if(!cap.isOpened())
  {
    ROS_INFO("Can not open camera!");
    return -1;
  }
  else
  {
    ROS_INFO("Camera opened success...");
  }
  cap.set(CV_CAP_PROP_FRAME_WIDTH ,640);
  cap.set(CV_CAP_PROP_FRAME_HEIGHT,480);
  cv::Mat frame;
  ros::Rate loop_rate(30);
  
  while(nh.ok()&&cap.isOpened())
  {
    // if(gainControl_flag)//控制权
    {
      cap>>frame;
      if(frame.empty())
      {
        ROS_INFO("frame is empty!");
        //TODO: 2018/12/26 是否该交出控制权?
        return -1;
      }
      else
      {
      //writer<<frame;//保存视频
      cv::imshow("camera frame",frame);
      if(cv::waitKey(10)==27)
      {
        ROS_INFO("ImagePro ESC...");
        //TODO: 2018/12/26 是否该交出控制权?
        return -1;
      }
      //发布图像消息
      sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg(); 
      pub.publish(msg);
      }
    }
    ros::spinOnce();
    loop_rate.sleep();
  }

}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Ubuntu上读取USB摄像头,你可以使用ROS(Robot Operating System)和ros-noetic-usb-cam软件包。首先,你需要安装ros-noetic-usb-cam软件包。在Ubuntu 20.04上,你可以使用以下命令进行安装:sudo apt-get install ros-noetic-usb-cam。如果你使用的是Ubuntu 18.04,你可以使用以下命令进行安装:sudo apt-get install ros-melodic-usb-cam。\[1\] 在安装完成后,你需要进行接口调试,因为ros-noetic-usb-cam默认调用的摄像机接口为/dev/video0,而实际连接的USB摄像头可能与其接口编号不一致。你可以参考这篇博客文章(https://blog.csdn.net/benchuspx/article/details/108765979)中的方法来修改接口。\[2\] 一旦接口调试完成,你可以使用ros-noetic-usb-cam来调用USB摄像头ros-noetic-usb-cam是ROS的官方示例程序之一,用于启动摄像头、获取图像并在屏幕上显示。你可以按照以下步骤来使用ros-noetic-usb-cam: 1. 打开终端并启动ROS:source /opt/ros/noetic/setup.bash 2. 启动ros-noetic-usb-cam节点:rosrun usb_cam usb_cam_node 3. 在另一个终端中,你可以使用rviz或image_view等工具来查看摄像头的图像。 这样,你就可以在Ubuntu上成功读取USB摄像头了。希望对你有帮助!\[3\] #### 引用[.reference_title] - *1* *2* *3* [ubuntu调用外接摄像头](https://blog.csdn.net/m0_60657960/article/details/129840397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值