ROS系统下面订阅ZED摄像头的图像以及深度
在这里先简单的展示一段代码
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <dirent.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
void depthCallback(const sensor_msgs::Image::ConstPtr& msg)
{
// Get a pointer to the depth values casting the data
// pointer to floating point
float* depths = (float*)(&msg->data[0]);
// Image coordinates of the center pixel
int u = msg->width / 2;
int v = msg->height / 2;
// Linear index of the center pixel
int centerIdx = u + msg->width * v;
// Output the measure
ROS_INFO("Center distance : %g m", depths[centerIdx]);
}
static const std::string OPENCV_WINDOW = "Image window";
class ImageConverter
{
ros::NodeHandle nh_;
image_transport::ImageTransport it_;
image_transport::Subscriber image_sub_;
image_transport::Publisher image_pub_; public:
ImageConverter()
: it_(nh_)
{ // Subscrive to input video feed and publish output video feed
image_sub_ = it_.subscribe("/zed/right/image_raw_color", 1,
&ImageConverter::imageCb, this);
image_pub_ = it_.advertise("/image_converter/output_video", 1);
cv::namedWindow(OPENCV_WINDOW);
}
~ImageConverter()
{
cv::destroyWindow(OPENCV_WINDOW);
}
void imageCb(const sensor_msgs::ImageConstPtr& msg)
{
cv_bridge::CvImagePtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
// Draw an example circle on the video stream
if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));
// Update GUI Window
cv::imshow(OPENCV_WINDOW, cv_ptr->image);
cv::waitKey(3);
// Output modified video stream
image_pub_.publish(cv_ptr->toImageMsg());
}
};
//blog.csdn.net/qq_29985391/article/details/80247724
int main(int argc, char** argv) {
ros::init(argc, argv, "zed_video_subscriber");
/*
* NodeHandle is the main access point to communications with the ROS system.
* The first NodeHandle constructed will fully initialize this node, and the last
* NodeHandle destructed will close down the node.
*/
ros::NodeHandle n;
ros::Subscriber subDepth = n.subscribe("/zed/depth/depth_registered", 10, depthCallback);
//--只需要声明一个对象即可------------------
ImageConverter ic;//定义一个对象
//----------------------------------------
ros::spin();
return 0;
}
其中CMakeList.txt书写如下:
cmake_minimum_required(VERSION 2.8.3)
project(zed_depth_sub_tutorial)
# if CMAKE_BUILD_TYPE is not specified, take 'Release' as default
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Release)
ENDIF(NOT CMAKE_BUILD_TYPE)
## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
roscpp
sensor_msgs
std_msgs
geometry_msgs
)
find_package(OpenCV REQUIRED)
if(NOT WIN32)
ADD_DEFINITIONS("-std=c++0x -O3")
endif(NOT WIN32)
## Declare a catkin package
catkin_package()
include_directories(include ${catkin_INCLUDE_DIRS})
include_directories ( ${OpenCV_INCLUDE_DIRS} )
## Build
add_executable(zed_depth_sub src/zed_depth_sub_tutorial.cpp)
##target_link_libraries(zed_depth_sub ${catkin_LIBRARIES})
target_link_libraries( zed_depth_sub ${OpenCV_LIBRARIES} ${OpenCV_LIBS} ${catkin_LIBRARIES})
最后配置xml文件
<package>
<name>zed_depth_sub_tutorial</name>
<version>2.7.0</version>
<description>
This package is a tutorial showing how to subscribe to ZED depth streams
</description>
<maintainer email="support@stereolabs.com">STEREOLABS</maintainer>
<license>MIT</license>
<url type="website">http://stereolabs.com/</url>
<url type="repository">https://github.com/stereolabs/zed-ros-wrapper</url>
<url type="bugtracker">https://github.com/stereolabs/zed-ros-wrapper/issues</url>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>image_transport</build_depend>
<build_depend>opencv2</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>cv_bridge</run_depend>
<run_depend>image_transport</run_depend>
<run_depend>opencv2</run_depend>
<run_depend>roscpp</run_depend>
<run_depend>sensor_msgs</run_depend>
<run_depend>std_msgs</run_depend>
</package>
报错了,怎是编译不了,这时如果大家用Qt进行编译发现报错,但是不指明在哪里报错,这时候可以到工作空间下,(我的工作空间是open_cv_ws),进行$catkin_make,这时候上面显示 format=”2″应该去掉,去掉之后重新编译一下就可以了。
总结
本次小实验可以学到:
-
知道话题
/zed/right/image_raw_color
可订阅ZED颜色图像,写在一个类里面,主程序直接定义一个对象就可以了 -
知道怎么去添加依赖,在CMakeList.txt中添加
find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport roscpp sensor_msgs std_msgs geometry_msgs ) find_package(OpenCV REQUIRED)
接下来就大功告成了
参考文献:
(1)
https://blog.csdn.net/qq_29985391/article/details/80247724
(2)相银初.OpenCV计算机视觉编程攻略
[ INFO] [1565176770.174158543]: Center distance : 1.25429 m
[ INFO] [1565176770.206849255]: Center distance : 1.25619 m
[ INFO] [1565176770.240136018]: Center distance : 1.25075 m
[ INFO] [1565176770.274275839]: Center distance : 1.25775 m
[ INFO] [1565176770.306532261]: Center distance : 1.25309 m
[ INFO] [1565176770.339874425]: Center distance : 1.25072 m
[ INFO] [1565176770.372813122]: Center distance : 1.24709 m
[ INFO] [1565176770.404490328]: Center distance : 1.24643 m
[ INFO] [1565176770.439586103]: Center distance : 1.25006 m
[ INFO] [1565176770.473377041]: Center distance : 1.24913 m
[ INFO] [1565176770.506936335]: Center distance : 1.24393 m
[ INFO] [1565176770.540292584]: Center distance : 1.24268 m
[ INFO] [1565176770.573506392]: Center distance : 1.24504 m
[ INFO] [1565176770.606003272]: Center distance : 1.24484 m
[ INFO] [1565176770.639587230]: Center distance : 1.24653 m
/home/wang/open_cv_ws/ydyd.png/home/wang/open_cv_ws/ydyd.png/home/wang/open_cv_ws/ydyd.png/home/wang/open_cv_ws/ydyd.png
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去
博客设置
页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的
代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
-
项目
-
项目
- 项目
-
项目
- 项目1
- 项目2
- 项目3
-
计划任务 -
完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用
:---------:
居中
使用
:----------
居左
使用
----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII |
HTML |
---|---|---|
Single backticks |
|
‘Isn’t this fun?’ |
Quotes |
|
“Isn’t this fun?” |
Dashes |
|
– is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
-
Text-to-
HTML
conversion tool - John
- Luke
Authors
如何创建一个注脚
一个具有注脚的文本。
1
注释也是必不可少的
Markdown将文本转换为
HTML
。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式
KaTeX
:
Gamma公式展示
Γ
(
n
)
=
(
n
−
1
)
!
∀
n
∈
N
\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N
Γ
(
n
)
=
(
n
−
1
)
!
∀
n
∈
N
是通过欧拉积分
Γ
(
z
)
=
∫
0
∞
t
z
−
1
e
−
t
d
t
 
.
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
Γ
(
z
)
=
∫
0
∞
t
z
−
1
e
−
t
d
t
.
你可以找到更多关于的信息
LaTeX
数学表达式
here
.
新的甘特图功能,丰富你的文章
-
关于
甘特图
语法,参考
这儿
,
UML 图表
可以使用UML图表进行渲染。
Mermaid
. 例如下面产生的一个序列图::
这将产生一个流程图。:
-
关于
Mermaid
语法,参考
这儿
,
FLowchart流程图
我们依旧会支持flowchart的流程图:
-
关于
Flowchart流程图
语法,参考
这儿
.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到
文章导出
,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
-
注脚的解释
↩︎