自己也是刚开始学习ros和openCV,经常会踩很多坑,比如这次在ros中使用openCV,按照很多博客写的,最后要么死机,要么黑框。对此,经过请教学长,终于调通,分享给大家以供参考。
#include
#include
#include // 将ROS下的sensor_msgs/Image消息类型转化为cv::Mat数据类型
#include // ROS下对图像进行处理
#include // 用来发布和订阅图像信息
#include
#include
#include
#include
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,其他大多博客这点都没有,导致出错
添加(最后两个的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})
未完待续
参考本人博客:订阅部分
欢迎留言讨论,指出不足和建议!