ROS—基于python3實(shí)現(xiàn)opencv圖像處理任務(wù)
點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)
網(wǎng)上所有的資料都是基于catkin工具進(jìn)行的,而且在編譯時(shí)會(huì)發(fā)現(xiàn)只支持opencv3,不支持opencv4,所以無(wú)法使用。
博主這里使用catkin_make工具成功編譯python3的cv_bridge,這篇博客應(yīng)該是全網(wǎng)唯一一個(gè)用catkin_make工具編譯cv_bridge而且最終運(yùn)行成功的博客了,也希望能幫到各位小伙伴開發(fā)ROS python3+opencv4的項(xiàng)目!
0.軟件環(huán)境
Ubuntu18.04
python3.6.9
ROS Melodic
Jetson系列基礎(chǔ)環(huán)境配置:Jetson系列——Ubuntu18.04版本基礎(chǔ)配置(換源、ROS、遠(yuǎn)程桌面、開機(jī)自連WIFi、SD卡備份):
https://blog.csdn.net/qq_45779334/article/details/108611797
樹莓派環(huán)境配置:樹莓派4B——Ubuntu 18.04.05安裝和基礎(chǔ)配置教程(包括WIFI和遠(yuǎn)程桌面配置、ROS和主從機(jī)控制):
https://blog.csdn.net/qq_45779334/article/details/108969323
虛擬機(jī)環(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,只有我們?cè)诰幾g完成后,才能基于python3的cv_bridge完成圖像相關(guān)節(jié)點(diǎn)的使用,所以編譯cv_bridge便是最基礎(chǔ)和最重要的一步,該博客詳細(xì)介紹了完整的編譯過程,按步驟進(jìn)行操作即可成功。
ROS——基于Ubuntu18.04和ROS Melodic編譯python3的cv_bridge:
https://blog.csdn.net/qq_45779334/article/details/119641789
在編譯好cv_bridge后,我們就可以進(jìn)行測(cè)試基于python3的圖像處理節(jié)點(diǎn)啦!
2.創(chuàng)建基于python3的圖像ROS節(jié)點(diǎn)
(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é)點(diǎn)
cd py3_demo && mkdir scriptscd scripts && touch camera.py img_process.pychmod +x camera.pychmod +x img_process.py
將以下兩個(gè)節(jié)點(diǎn)代碼分別粘進(jìn)對(duì)應(yīng)的文件中:
攝像頭發(fā)布節(jié)點(diǎn)
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é)點(diǎn)? ?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正常退出,如果異常退出會(huì)報(bào)錯(cuò)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í)行時(shí)間,從而確定合適的rate? ? ? ? ? ?rate = rospy.Rate(25) # 10hz? ?capture.release()? ?cv2.destroyAllWindows()? ?print("quit successfully!")
攝像頭接收處理節(jié)點(diǎn)
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.運(yùn)行節(jié)點(diǎn)
(1)編譯
cd ../../..catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
(2)將工作空間添加進(jìn)環(huán)境變量
sudo vim ~/.bashrcsource /home/nano/workspace/py3_test_ws/devel/setup.bash
(3)運(yùn)行節(jié)點(diǎn)
roscorerosrun py3_demo camera.pyrosrun py3_demo img_process.py
運(yùn)行效果圖
可以看到,打印出的python版本為3.6.9:

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