最近项目需要读取双目相机获取图像数据并发布出来,做个简单记录
并没有什么原理性的东西,就是调用opencv的API启动相机读取图像数据,然后嵌套进ros框架中
#include<iostream>
#include<ros/ros.h>
#include<opencv2/highgui.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/imgproc.hpp>
#include<std_msgs/Header.h>
#include<cv_bridge/cv_bridge.h>
#include<sensor_msgs/image_encodings.h>
#include<image_transport/image_transport.h>
int main(int argc, char **argv)
{
/* 节点初始化 */
ros::init(argc, argv, "usb_cam");
/* 句柄初始化 */
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
/* 频率设置 */
ros::Rate loop_rate(20);
/* 定义两个发布者 */
image_transport::Publisher pub_left = it.advertise("/camera/left/image_raw", 20);
image_transport::Publisher pub_right = it.advertise("/camera/right/image_raw", 20);
/* 定义图像变量(opencv) */
cv::Mat imgl, imgr, frame;
sensor_msgs::ImagePtr msgl, msgr;
/* 打开相机 */
std::cout<<"初始化相机"<<std::endl;
cv::VideoCapture cap(0);
std::cout<<"完成相机初始化"<<std::endl;
cap.set(cv::CAP_PROP_FRAME_WIDTH, 2560);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);
cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
if (!cap.isOpened())
{
std::cout<<"相机未打开!"<<std::endl;
return 0;
}
else
{
std::cout<<"相机打开!"<<std::endl;
}
while (nh.ok())
{
/* 读取相机视频流 */
cap.read(frame);
if (frame.empty())
{
std::cout<<"未读取到视频数据"<<std::endl;
continue;
}
/* 分割图像 */
imgl = frame(cv::Rect(0, 0, 1280, 720));
imgr = frame(cv::Rect(1280, 0, 1280, 720));
/* opencv转换ros图像数据 */
msgl = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imgl).toImageMsg();
msgr = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imgr).toImageMsg();
/* 发布数据 */
pub_left.publish(msgl);
pub_right.publish(msgr);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容