在ROS中用openCV显示摄像头并发布图像数据
前言
自己也是刚开始学习ros和openCV,经常会踩很多坑,比如这次在ros中使用openCV,按照很多博客写的,最后要么死机,要么黑框。对此,经过请教学长,终于调通,分享给大家以供参考。
使用C++实现
#include <iostream>
#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h> // 将ROS下的sensor_msgs/Image消息类型转化为cv::Mat数据类型
#include <sensor_msgs/image_encodings.h> // ROS下对图像进行处理
#include <image_transport/image_transport.h> // 用来发布和订阅图像信息
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio.hpp>
int main(int argc, char** argv)
{
ros::init(argc, argv, "imageGet_node"); // ros初始化,定义节点名为imageGet_node
ros::NodeHandle nh; // 定义ros句柄
image_transport::ImageTransport it(nh); // 类似ROS句柄
image_transport::Publisher image_pub = it.advertise("/cameraImage", 1); // 发布话题名/cameraImage
ros::Rate loop_rate(200); // 设置刷新频率,Hz
cv::Mat imageRaw; // 原始图像保存
cv::VideoCapture capture(0); // 创建摄像头捕获,并打开摄像头0(一般是0,2....)
if(capture.isOpened() == 0) // 如果摄像头没有打开
{
std::cout << "Read camera failed!" << std::endl;
return -1;
}
while(nh.ok())
{
capture.read(imageRaw); // 读取当前图像到imageRaw
cv::imshow("veiwer", imageRaw); // 将图像输出到窗口
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imageRaw).toImageMsg(); // 图像格式转换
image_pub.publish(msg); // 发布图像信息
ros::spinOnce(); // 没什么卵用,格式像样
loop_rate.sleep(); // 照应上面设置的频率
if(cv::waitKey(2) >= 0) // 延时ms,按下任何键退出(必须要有waitKey,不然是看不到图像的)
break;
}
}
一定要注意,waitKey()必须要有,且不为0,其他大多博客这点都没有,导致出错
*ls -l /dev/ttyUSB 命令查看串口 **
CMakeLists.txt配置
添加(最后两个的image_Get是生成可执行文件的名字,根据自己来设定):
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(image_Get src/image_Get.cpp)
target_link_libraries(image_Get ${catkin_LIBRARIES} ${OpenCV_LIBS})
使用python实现
未完待续
查看usb串口使用情况
ls -l /dev/ttyUSB*
永久打开串口权限
若出现[Errno 13] Permission denied: '/dev/ttyUSB0’问题,可以用下面命令打开串口权限:
sudo chmod 777 /dev/ttyUSB0
sudo usermod -aG dialout nankel
其中nankel为用户名
ROS使用openCV进行图片接收,并显示
参考本人博客:订阅部分
客官!如果觉得有用,给俺点赞支持下呗!
欢迎留言讨论,指出不足和建议!