使用环境:
- Windows10
- Raspberry Pi 4B
- Python :3.7.3
Windows下使用 AprilTags
在windows中安装 apriltags 库:
pip install pupil-apriltags
代码部分:
import pupil_apriltags as apriltag # 在 windows 下引入该库
import cv2
img = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE)
detector = apriltag.Detector()
result = detector.detect(img)
print(result)
识别后得到的信息:
通过检测到的参数,标记四个角点。
#!/usr/bin/env python
# coding: UTF-8
import pupil_apriltags as apriltag
import cv2
img = cv2.imread("tag36h11_0.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建一个apriltag检测器
detector = apriltag.Detector(families='tag36h11') # windows
# 进行apriltag检测,得到检测到的apriltag的列表
tags = detector.detect(gray)
for tag in tags:
cv2.circle(img, tuple(tag.corners[0].astype(int)), 4, (255, 0, 255), 2) # left-top
cv2.circle(img, tuple(tag.corners[1].astype(int)), 4, (255, 0, 255), 2) # right-top
cv2.circle(img, tuple(tag.corners[2].astype(int)), 4, (255, 0, 255), 2) # right-bottom
cv2.circle(img, tuple(tag.corners[3].astype(int)), 4, (255, 0, 255), 2) # left-bottom
cv2.imshow("out_image", img)
cv2.imwrite('image.png', img)
cv2.waitKey()
使用line绘制边框
import cv2
import pupil_apriltags as apriltag # windows
image = cv2.imread('tag36h11_0.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 创建一个apriltag检测器,然后检测AprilTags
options = apriltag.Detector(families='tag36h11') # windows
results = options.detect(gray)
print(results)
for r in results:
# 获取4个角点的坐标
b = (tuple(r.corners[0].astype(int))[0], tuple(r.corners[0].astype(int))[1])
c = (tuple(r.corners[1].astype(int))[0], tuple(r.corners[1].astype(int))[1])
d = (tuple(r.corners[2].astype(int))[0], tuple(r.corners[2].astype(int))[1])
a = (tuple(r.corners[3].astype(int))[0], tuple(r.corners[3].astype(int))[1])
# 绘制检测到的AprilTag的框
cv2.line(image, a, b, (255, 0, 255), 2, lineType=cv2.LINE_AA)
cv2.line(image, b, c, (255, 0, 255), 2, lineType=cv2.LINE_AA)
cv2.line(image, c, d, (255, 0, 255), 2, lineType=cv2.LINE_AA)
cv2.line(image, d, a, (255, 0, 255), 2, lineType=cv2.LINE_AA)
# 绘制 AprilTag 的中心坐标
(cX, cY) = (int(r.center[0]), int(r.center[1]))
cv2.circle(image, (cX, cY), 5, (0, 0, 255), -1)
# 在图像上绘制标文本
tagFamily = r.tag_family.decode("utf-8")
cv2.putText(image, tagFamily, (a[0], a[1] - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
cv2.imwrite('image1.png', image)
cv2.imshow("Image", image)
cv2.waitKey(0)
树莓派4B下使用 AprilTags
在树莓派下安装 AprilTags
pip3 install apriltag
pi@raspberrypi:~ $ pip3 install apriltag
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting apriltag
Downloading https://www.piwheels.org/simple/apriltag/apriltag-0.0.16-cp37-cp37m-linux_armv7l.whl (433kB)
100% |████████████████████████████████| 440kB 212kB/s
Installing collected packages: apriltag
Successfully installed apriltag-0.0.16
打开树莓派4B摄像头进行检测
#!/usr/bin/env python
# coding: UTF-8
import apriltag
import cv2
cap = cv2.VideoCapture(0)
at_detector = apriltag.Detector(apriltag.DetectorOptions(families='tag36h11'))
while(1):
# 获得图像
ret, frame = cap.read()
# 检测按键
k = cv2.waitKey(1)
if k==27:
break
# 检测apriltag
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
tags = at_detector.detect(gray)
for tag in tags:
cv2.circle(frame, tuple(tag.corners[0].astype(int)), 4, (255, 0, 0), 2) # left-top
cv2.circle(frame, tuple(tag.corners[1].astype(int)), 4, (255, 0, 0), 2) # right-top
cv2.circle(frame, tuple(tag.corners[2].astype(int)), 4, (255, 0, 0), 2) # right-bottom
cv2.circle(frame, tuple(tag.corners[3].astype(int)), 4, (255, 0, 0), 2) # left-bottom
# 显示检测结果
cv2.imshow('capture', frame)
cap.release()
cv2.destroyAllWindows()
打开树莓派4B摄像头进行检测使用类进行封装
import cv2
import apriltag
class ApriltagDetect:
def __init__(self):
self.target_id = 0
self.at_detector = apriltag.Detector(apriltag.DetectorOptions(families='tag36h11'))
def update_frame(self,frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
tags = self.at_detector.detect(gray)
for tag in tags:
print(tag.tag_id)
cv2.circle(frame, tuple(tag.corners[0].astype(int)), 4, (0, 0, 255), 2) # left-top
cv2.circle(frame, tuple(tag.corners[1].astype(int)), 4, (0, 0, 255), 2) # right-top
cv2.circle(frame, tuple(tag.corners[2].astype(int)), 4, (0, 0, 255), 2) # right-bottom
cv2.circle(frame, tuple(tag.corners[3].astype(int)), 4, (0, 0, 255), 2) # left-bottom
apriltag_width = abs(tag.corners[0][0] - tag.corners[1][0]) / 2
target_x = apriltag_width / 2
if __name__ == '__main__':
cap = cv2.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
ad = ApriltagDetect()
while True:
ret, frame = cap.read()
frame = cv2.rotate(frame, cv2.ROTATE_180)
ad.update_frame(frame)
cv2.imshow("capture", frame)
if cv2.waitKey(100) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
踩坑:
安装 opencv-python 库后,无法引用cv2:
pi@raspberrypi:~/Desktop $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import cv2
Traceback (most recent call last):
File “”, line 1, in
File “/home/pi/.local/lib/python3.7/site-packages/cv2/init.py”, line 3, in
from .cv2 import *
ImportError: libhdf5_serial.so.103: cannot open shared object file: No such file or directory
解决方法:
在树莓派下安装 opencv-python 库
pip3 install opencv-python
pi@raspberrypi:~/Desktop $ pip3 install opencv-python
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting opencv-python
Downloading https://www.piwheels.org/simple/opencv-python/opencv_python-4.5.3.56-cp37-cp37m-linux_armv7l.whl (10.4MB)
100% |████████████████████████████████| 10.4MB 41kB/s
Requirement already satisfied: numpy>=1.14.5 in /usr/lib/python3/dist-packages (from opencv-python) (1.16.2)
Installing collected packages: opencv-python
Successfully installed opencv-python-4.5.3.56
安装 opencv-contrib-python
库
pi@raspberrypi:~/Desktop $ pip3 install opencv-contrib-python==4.1.0.25
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting opencv-contrib-python==4.1.0.25
Downloading https://www.piwheels.org/simple/opencv-contrib-python/opencv_contrib_python-4.1.0.25-cp37-cp37m-linux_armv7l.whl (15.7MB)
100% |████████████████████████████████| 15.7MB 27kB/s
Requirement already satisfied: numpy>=1.16.2 in /usr/lib/python3/dist-packages (from opencv-contrib-python==4.1.0.25) (1.16.2)
Installing collected packages: opencv-contrib-python
Successfully installed opencv-contrib-python-4.1.0.25
安装 libatlas-base-dev
pi@raspberrypi:~/Desktop $ sudo apt-get install libatlas-base-dev -y
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
将会同时安装下列软件:
libatlas3-base
建议安装:
libatlas-doc liblapack-doc
下列【新】软件包将被安装:
libatlas-base-dev libatlas3-base
升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 151 个软件包未被升级。
需要下载 5,365 kB 的归档。
解压缩后会消耗 32.1 MB 的额外空间。
获取:1 http://mirrors.sjtug.sjtu.edu.cn/raspbian/raspbian buster/main armhf libatlas3-base armhf 3.10.3-8+rpi1 [2,399 kB]
获取:2 http://mirrors.sjtug.sjtu.edu.cn/raspbian/raspbian buster/main armhf libatlas-base-dev armhf 3.10.3-8+rpi1 [2,966 kB]
已下载 5,365 kB,耗时 10秒 (555 kB/s)
正在选中未选择的软件包 libatlas3-base:armhf。
(正在读取数据库 … 系统当前共安装有 180903 个文件和目录。)
准备解压 …/libatlas3-base_3.10.3-8+rpi1_armhf.deb …
正在解压 libatlas3-base:armhf (3.10.3-8+rpi1) …
正在选中未选择的软件包 libatlas-base-dev:armhf。
准备解压 …/libatlas-base-dev_3.10.3-8+rpi1_armhf.deb …
正在解压 libatlas-base-dev:armhf (3.10.3-8+rpi1) …
正在设置 libatlas3-base:armhf (3.10.3-8+rpi1) …
update-alternatives: 使用 /usr/lib/arm-linux-gnueabihf/atlas/libblas.so.3 来在自动模式中提供 /usr/lib/arm-linux-gnueabihf/libblas.so.3 (libblas.so.3-arm-linux-gnueabihf)
update-alternatives: 使用 /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so.3 来在自动模式中提供 /usr/lib/arm-linux-gnueabihf/liblapack.so.3 (liblapack.so.3-arm-linux-gnueabihf)
正在设置 libatlas-base-dev:armhf (3.10.3-8+rpi1) …
update-alternatives: 使用 /usr/lib/arm-linux-gnueabihf/atlas/libblas.so 来在自动模式中提供 /usr/lib/arm-linux-gnueabihf/libblas.so (libblas.so-arm-linux-gnueabihf)
update-alternatives: 使用 /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so 来在自动模式中提供 /usr/lib/arm-linux-gnueabihf/liblapack.so (liblapack.so-arm-linux-gnueabihf)
正在处理用于 libc-bin (2.28-10+rpi1) 的触发器 …
安装 libjasper-dev
pi@raspberrypi:~/Desktop $ sudo apt-get install libjasper-dev -y
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
将会同时安装下列软件:
libjasper1
建议安装:
libjasper-runtime
下列【新】软件包将被安装:
libjasper-dev libjasper1
升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 151 个软件包未被升级。
需要下载 611 kB 的归档。
解压缩后会消耗 1,207 kB 的额外空间。
获取:1 http://mirrors.sjtug.sjtu.edu.cn/raspbian/raspbian buster/main armhf libjasper1 armhf 1.900.1-debian1-2.4+deb8u1 [110 kB]
获取:2 http://mirrors.bfsu.edu.cn/raspbian/raspbian buster/main armhf libjasper-dev armhf 1.900.1-debian1-2.4+deb8u1 [501 kB]
已下载 611 kB,耗时 3秒 (232 kB/s)
正在选中未选择的软件包 libjasper1:armhf。
(正在读取数据库 … 系统当前共安装有 181101 个文件和目录。)
准备解压 …/libjasper1_1.900.1-debian1-2.4+deb8u1_armhf.deb …
正在解压 libjasper1:armhf (1.900.1-debian1-2.4+deb8u1) …
正在选中未选择的软件包 libjasper-dev。
准备解压 …/libjasper-dev_1.900.1-debian1-2.4+deb8u1_armhf.deb …
正在解压 libjasper-dev (1.900.1-debian1-2.4+deb8u1) …
正在设置 libjasper1:armhf (1.900.1-debian1-2.4+deb8u1) …
正在设置 libjasper-dev (1.900.1-debian1-2.4+deb8u1) …
安装 libqtgui4
pi@raspberrypi:~/Desktop $ sudo apt-get install libqtgui4 -y
安装 python3-pyqt5
sudo apt-get install python3-pyqt5 -y
安装 libqt4-test
pi@raspberrypi:~/Desktop $ sudo apt-get install libqt4-test -y
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
下列【新】软件包将被安装:
libqt4-test
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 151 个软件包未被升级。
需要下载 98.0 kB 的归档。
解压缩后会消耗 250 kB 的额外空间。
获取:1 http://mirrors.bfsu.edu.cn/raspbian/raspbian buster/main armhf libqt4-test armhf 4:4.8.7+dfsg-18+rpi1+deb10u1 [98.0 kB]
已下载 98.0 kB,耗时 1秒 (71.5 kB/s)
正在选中未选择的软件包 libqt4-test:armhf。
(正在读取数据库 … 系统当前共安装有 181337 个文件和目录。)
准备解压 …/libqt4-test_4%3a4.8.7+dfsg-18+rpi1+deb10u1_armhf.deb …
正在解压 libqt4-test:armhf (4:4.8.7+dfsg-18+rpi1+deb10u1) …
正在设置 libqt4-test:armhf (4:4.8.7+dfsg-18+rpi1+deb10u1) …
正在处理用于 libc-bin (2.28-10+rpi1) 的触发器 …
安装 libhdf5-devt
pi@raspberrypi:~/Desktop $ sudo apt-get install libhdf5-dev -y
安装完以上内容后,才能使用opencv-python
库
测试 opencv-python
能否使用:
pi@raspberrypi:~/Desktop $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import cv2
>>> cv2.version
‘4.1.0’
显示版本号后,说明opencv-python
库可以被使用了。
指令集为:aarch64下,可以尝试使用 apt 安装 python3-opencv
sudo apt install python3-opencv
pi@raspbian:~/桌面$ sudo apt install python3-opencv
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following package was automatically installed and is no longer required:
libre2-5
Use ‘sudo apt autoremove’ to remove it.
The following additional packages will be installed:
autoconf automake autotools-dev gdal-data gfortran gfortran-8 libaec0 libarmadillo9 libarpack2
libcaf-openmpi-3 libcharls2 libcoarrays-dev libcoarrays-openmpi-dev libdap25 libdapclient6v5
libdapserver7v5 libepsilon1 libfreexl1 libfyba0 libgdal20 libgdcm2.8 libgeos-3.7.1 libgeos-c1v5
libgeotiff2 libgfortran-8-dev libgl2ps1.4 libhdf4-0-alt libhdf5-103 libhdf5-openmpi-103 libhwloc-dev
libhwloc-plugins libhwloc5 libibverbs-dev libkmlbase1 libkmlconvenience1 libkmldom1 libkmlengine1
…
…
…
Setting up libopencv-highgui3.2:arm64 (3.2.0+dfsg-6) …
Setting up libopencv-features2d3.2:arm64 (3.2.0+dfsg-6) …
Setting up libopencv-calib3d3.2:arm64 (3.2.0+dfsg-6) …
Setting up libopencv-objdetect3.2:arm64 (3.2.0+dfsg-6) …
Setting up libopencv-stitching3.2:arm64 (3.2.0+dfsg-6) …
Setting up libopencv-videostab3.2:arm64 (3.2.0+dfsg-6) …
Setting up libopencv-contrib3.2:arm64 (3.2.0+dfsg-6) …
Setting up python3-opencv (3.2.0+dfsg-6) …
Processing triggers for libc-bin (2.28-10) …
Processing triggers for man-db (2.8.5-2) …