1.广播
1.usb读取摄像头,并广播出去
catkin_create_pkg camera_pub cv_bridge roscpp sensor_msgs image_transport std_msgs
camera_pub.cpp
注意:此文件为了方便更改相机串口号设置的为launch文件读设备号,如果不需要,可将下面
cv::VideoCapture cap(usb_number);
将usb_number设为需要的值。
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
//OpenCV2标准头文件
#include <sensor_msgs/image_encodings.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
//https://blog.youkuaiyun.com/sinat_16643223/article/details/113531736?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.nonecase
using namespace std;
using namespace cv;
int usb_number;
image_transport::Publisher image_pub;
int main(int argc, char **argv)
{
ros::init(argc, argv, "usb_cam");
ros::NodeHandle nh;
ros::param::get("~usb_number",usb_number);
image_transport::ImageTransport it(nh);
ros::Rate loop_rate(30);
image_pub=it.advertise("/camera/rgb/image_raw",1);
cout<<"**************************"<<usb_number<<endl;
cv::VideoCapture cap(usb_number);
//设置摄像头分辨率
//cv::Size image_size = Size(1920.0,1080.0);
//cap.set(CAP_PROP_FRAME_WIDTH,image_size.height);
//cap.set(CAP_PROP_FRAME_HEIGHT,image_size.width);
cv::Mat frame;
//设置全屏
//namedWindow("web_cam",CV_WINDOW_NORMAL);
//setWindowProperty("web_cam_frame",CV_WND_PROP_FULLSCREEN,CV_WINDOW_FULLSCREEN);
sensor_msgs::ImagePtr msg;
bool first_in=true;
while(ros::ok())
{
cap>>frame;
if(!frame.empty())
{
if(first_in)
{
cout<<"IM RESOLUTION: "<<frame.cols<<"x"<<frame.rows<<endl;
first_in=false;
}
//设置图像帧格式->bgr8
msg=cv_bridge::CvImage(std_msgs::Header(),"bgr8",frame).toImageMsg();
image_pub.publish(msg);
}
ros::spinOnce();
loop_rate.sleep();
}
cap.release();
}
2.CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(camera_pub)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
roscpp
sensor_msgs
std_msgs
)
find_package(OpenCV REQUIRED)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES camera_pub
CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs std_msgs
# DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
add_executable(camera_pub src/camera_pub.cpp)
target_link_libraries(camera_pub ${catkin_LIBRARIES} ${OpenCV_LIBS})
2.订阅广播相机,图像显示
catkin_create_pkg camera_sub cv_bridge roscpp sensor_msgs image_transport std_msgs
1.camera_sub.cpp
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
//OpenCV2标准头文件
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
cv::Mat img=cv_bridge::toCvShare(msg, "bgr8")->image;
cv::Mat img1=img;
cv::imshow("aaa",img);
cv::waitKey(10);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "image_listener");
ros::NodeHandle nh;
cv::startWindowThread();
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("/camera/rgb/image_raw", 1, imageCallback);
ros::spin();
}
2.CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(camera_sub)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
cv_bridge
roscpp
rospy
sensor_msgs
image_transport
std_msgs
)
find_package(OpenCV REQUIRED)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES recive_rgb
CATKIN_DEPENDS cv_bridge roscpp rospy sensor_msgs std_msgs std_srvs
# DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
add_executable(camera_sub src/camera_sub.cpp)
target_link_libraries(camera_sub ${catkin_LIBRARIES} ${OpenCV_LIBS})
3.两个节点启动文件launch
<launch>
<node pkg="camera_sub" type="camera_sub" name="camera_sub" output="screen">
</node>
<node pkg="camera_pub" type="camera_pub" name="camera_pub" output="screen">
<param name="usb_number" type="int" value="11"/>
</node>
</launch>
lsusb,未防止串口号变动,给摄像头起别名,https://blog.youkuaiyun.com/JanKin_BY/article/details/114308643?spm=1001.2014.3001.5502