ROS—基于python3實現(xiàn)opencv圖像處理任務(wù)
點擊下方卡片,關(guān)注“新機器視覺”公眾號
重磅干貨,第一時間送達
網(wǎng)上所有的資料都是基于catkin工具進行的,而且在編譯時會發(fā)現(xiàn)只支持opencv3,不支持opencv4,所以無法使用。
博主這里使用catkin_make工具成功編譯python3的cv_bridge,這篇博客應(yīng)該是全網(wǎng)唯一一個用catkin_make工具編譯cv_bridge而且最終運行成功的博客了,也希望能幫到各位小伙伴開發(fā)ROS python3+opencv4的項目!
0.軟件環(huán)境
Ubuntu18.04
python3.6.9
ROS Melodic
Jetson系列基礎(chǔ)環(huán)境配置:Jetson系列——Ubuntu18.04版本基礎(chǔ)配置(換源、ROS、遠程桌面、開機自連WIFi、SD卡備份):
https://blog.csdn.net/qq_45779334/article/details/108611797
樹莓派環(huán)境配置:樹莓派4B——Ubuntu 18.04.05安裝和基礎(chǔ)配置教程(包括WIFI和遠程桌面配置、ROS和主從機控制):
https://blog.csdn.net/qq_45779334/article/details/108969323
虛擬機環(huán)境配置:Ubuntu——雙系統(tǒng)Ubuntu18.04系統(tǒng)安裝和基礎(chǔ)配置并安裝ROS:
https://blog.csdn.net/qq_45779334/article/details/113815018
1.編譯python3的cv_bridge
在ROS中想使用python3,最重要的就是需要重新編譯基于python3的cv_bridge,只有我們在編譯完成后,才能基于python3的cv_bridge完成圖像相關(guān)節(jié)點的使用,所以編譯cv_bridge便是最基礎(chǔ)和最重要的一步,該博客詳細介紹了完整的編譯過程,按步驟進行操作即可成功。
ROS——基于Ubuntu18.04和ROS Melodic編譯python3的cv_bridge:
https://blog.csdn.net/qq_45779334/article/details/119641789
在編譯好cv_bridge后,我們就可以進行測試基于python3的圖像處理節(jié)點啦!
2.創(chuàng)建基于python3的圖像ROS節(jié)點
(1)初始化py3_test_ws工作空間
mkdir py3_test_ws && cd py3_test_wsmkdir src && cd srccatkin_init_workspace
(2)創(chuàng)建功能包
catkin_create_pkg py3_demo rospy rosmsg roscpp(3)編寫python3的圖像發(fā)布和接收節(jié)點
cd py3_demo && mkdir scriptscd scripts && touch camera.py img_process.pychmod +x camera.pychmod +x img_process.py
將以下兩個節(jié)點代碼分別粘進對應(yīng)的文件中:
攝像頭發(fā)布節(jié)點
camera.py
#!/usr/bin/env python3import cv2import numpy as npimport rospyfrom std_msgs.msg import Headerfrom sensor_msgs.msg import Imagefrom cv_bridge import CvBridge , CvBridgeErrorimport timeif __name__=="__main__":? ?import sys? ?print(sys.version) # 查看python版本? ?capture = cv2.VideoCapture(0) # 定義攝像頭? ?rospy.init_node('camera_node', anonymous=True) #定義節(jié)點? ?image_pub=rospy.Publisher('/image_view/image_raw', Image, queue_size = 1) #定義話題? ?? ?header = Header(stamp = rospy.Time.now())? ?header.frame_id = "Camera"? ?ros_frame = Image()? ?ros_frame.header=header? ?ros_frame.width = 640? ?ros_frame.height = 480? ?ros_frame.encoding = "bgr8"? ?# ros_frame.step = 1920? ?while not rospy.is_shutdown(): ? ?# Ctrl C正常退出,如果異常退出會報錯device busy!? ? ? ?start = time.time()? ? ? ?ret, frame = capture.read()? ? ? ?if ret: # 如果有畫面再執(zhí)行? ? ? ? ? ?? ? ? ? ? ?frame = cv2.flip(frame,1) ? #水平鏡像操作 ?? ?? ? ? ? ? ?ros_frame.data = np.array(frame).tostring() #圖片格式轉(zhuǎn)換? ? ? ? ? ?image_pub.publish(ros_frame) #發(fā)布消息? ? ? ? ? ?end = time.time() ?? ? ? ? ? ?print("cost time:", end-start ) # 看一下每一幀的執(zhí)行時間,從而確定合適的rate? ? ? ? ? ?rate = rospy.Rate(25) # 10hz? ?capture.release()? ?cv2.destroyAllWindows()? ?print("quit successfully!")
攝像頭接收處理節(jié)點
img_process.py
#!/usr/bin/env python3import rospyimport numpy as npfrom sensor_msgs.msg import Imagefrom cv_bridge import CvBridge, CvBridgeErrorimport cv2def callback(data):? ?cv_img = bridge.imgmsg_to_cv2(data, "bgr8")? ?cv2.imshow("frame" , cv_img)? ?cv2.waitKey(1)if __name__ == '__main__':? ?import sys? ?print(sys.version) # 查看python版本? ?? ?rospy.init_node('img_process_node', anonymous=True)? ?bridge = CvBridge()? ?rospy.Subscriber('/image_view/image_raw', Image, callback)? ?rospy.spin()
3.運行節(jié)點
(1)編譯
cd ../../..catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
(2)將工作空間添加進環(huán)境變量
sudo vim ~/.bashrcsource /home/nano/workspace/py3_test_ws/devel/setup.bash
(3)運行節(jié)點
roscorerosrun py3_demo camera.pyrosrun py3_demo img_process.py
運行效果圖
可以看到,打印出的python版本為3.6.9:

在這之后就可以使用python3進行圖像處理、深度學(xué)習(xí)等任務(wù)節(jié)點的開發(fā)啦,如果你也成功跑通了該項目,給博主點個贊支持下吧,嘻嘻~
4.與C++圖像處理節(jié)點混合使用
ROS——C++與Python3的圖像節(jié)點基于OpenCV相互發(fā)送和接收
https://blog.csdn.net/qq_45779334/article/details/124323809
來源:古月居
本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
