Ros Kinetic 配置 OpenCV2和CV_bridge (Python, C++)
本篇介绍如何在Ros-kinetic环境下运用opencv2进行开发的配置,系统平台为64位Ubuntu16.04。
需要系统环境:
1.Ros kinetic版本,一般自带cv_bridge, 若没有可以通过apt下载
sudo apt-get install ros-kinetic-cv-bridge
2.OpenCV 2.4.9版本,一般来说cv_bridge依赖的OpenCV版本为2.4.8,亲测2.4.9可以用,安装可以参考https://blog.csdn.net/u013250416/article/details/78913126
2.1 先下载OpenCV的源码http://opencv.org/downloads.html并解压到任意目录
2.2 事先安装下列软件
sudo apt-get install build-essential cmake libgtk2.0-dev pkg-config python-dev python-numpy libavcodec-dev libavformat-dev libswscale-dev
2.3 进入cmake并编译
cd cmake cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. sudo make install
2.4 测试
新建C++代码test.cpp:
1 #include <opencv2/core/core.hpp> 2 #include <opencv2/imgproc/imgproc.hpp> 3 #include <opencv2/highgui/highgui.hpp> 4 #include <iostream> 5 using namespace cv; 6 using namespace std; 7 int main (int argc, char **argv) 8 { 9 Mat image, image_gray; 10 image = imread(argv[1], CV_LOAD_IMAGE_COLOR ); 11 if (argc != 2 || !image.data) { 12 cout << "No image data\n"; 13 return -1; 14 } 15 16 cvtColor(image, image_gray, CV_RGB2GRAY); 17 namedWindow("image", CV_WINDOW_AUTOSIZE); 18 namedWindow("image gray", CV_WINDOW_AUTOSIZE); 19 20 imshow("image", image); 21 imshow("image gray", image_gray); 22 23 waitKey(0); 24 return 0; 25 }
新建makefile文件:
CC = g++ # 可执行文件 TARGET = test # C文件 SRCS = main.cpp # 目标文件 OBJS = $(SRCS:.cpp=.o) # 库文件 DLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui # 链接为可执行文件 $(TARGET):$(OBJS) $(CC) -o $@ $^ $(DLIBS) clean: rm -rf $(TARGET) $(OBJS) # 编译规则 $@代表目标文件 $< 代表第一个依赖文件 %.o:%.cpp $(CC) -o $@ -c $<
make,产生了两个文件:test文件和test.o文件 ,并测试:
./test lena.bmp
注:程序运行的过程中,常见错误error while loading shared libraries: libopencv_highgui.so.2.4: cannot open,解决方法:
1.用gedit打开/etc/ld.so.conf,注意要用sudo打开获得权限,不然无法修改,
如:sudo gedit /etc/ld.so.conf,在文件中加上一行 /usr/loacal/lib,/user/loacal是opencv安装路径 就是makefile中指定的安装路径
加了之后的变为
2.再运行sudo ldconfig,
修改bash.bashrc文件,sudo gedit /etc/bash.bashrc
在文件末尾加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
加后的图:
3.
source /etc/bash.bashrc
然后就可以正常运行了!
Python环境配置:
python下由于ros一般自带cv_bridge,系统同样自带cv2,处理起来比较简单,当摄像机采出的图像以rostopic发布时,可以用以下代码进行测试:
1 import rospy 2 from sensor_msgs.msg import Image 3 import cv2 4 from cv_bridge import CvBridge, CvBridgeError 5 6 class Image_Receiver: 7 def __init__(self): 8 rospy.Subscriber('/camera/rgb/image_color', Image, callback=self.image_rgb_callback, queue_size=1000) 9 self.cv_bridge = CvBridge() 10 rospy.spin() 11 12 def image_rgb_callback(self, data): 13 cv_image = self.cv_bridge.imgmsg_to_cv2(data, "bgr8") 14 (rows, cols, channnels) = cv_image.shape 15 if cols > 60 and rows > 60: 16 cv2.circle(cv_image, (50, 50), 10, 255) 17 cv2.imshow("Image Window", cv_image) 18 cv2.waitKey(3) 19 20 if __name__ == '__main__': 21 rospy.init_node('rgb_image_get_node') 22 Image_Receiver()
C++ QT环境配置:
由于本人开发环境为qt,则需要在qmake执行.pro文件时同时加载ros和opencv2的环境,在.pro文件中添加以下依赖:
# ROS Depends INCLUDEPATH += /opt/ros/kinetic/include \ DEPENDPATH += /opt/ros/kinetic/include \ LIBS += -L/opt/ros/kinetic/lib \ -L/usr/local/lib \ -lroscpp \ -lrospack \ -lpthread \ -lrosconsole \ -lrosconsole_log4cxx \ -lrosconsole_backend_interface \ -lxmlrpcpp \ -lroscpp_serialization \ -lrostime \ -lcpp_common \ -lroslib \ -ltf \ -lyaml-cpp \ -lkdl_conversions \ -lcv_bridge \ -lboost_system # OpenCV Depends LIBS += -lopencv_core \ -lopencv_imgproc \ -lopencv_highgui
编写测试代码如下:
#include <ros/ros.h> #include <sensor_msgs/Image.h> #include <cv_bridge/cv_bridge.h> class Image_Receiver { public: Image_Receiver() { subsRgbImage = nh.subscribe<sensor_msgs::Image>("/camera/rgb/image_color", 1000, &Image_Receiver::image_rgb_callback, this); ros::spin(); } ~Image_Receiver() { } void image_rgb_callback(const sensor_msgs::Image::ConstPtr& data) { cv_bridge::CvImagePtr cv_ptr; try{ cv_ptr = cv_bridge::toCvCopy(data, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { std::cout << e.what() << std::endl; } receiveFlag = true; } private: sensor_msgs::Image::ConstPtr m_data; ros::NodeHandle nh; ros::Subscriber subsRgbImage; bool receiveFlag; }; int main(int argc, char** argv) { ros::init(argc, argv, "image_receive_node"); Image_Receiver image_receiver_instance; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具