目录
前言
要完成opencv绘制栅格地图,需要具备的基础知识:opencv相关函数的简单使用(包括简单图形和网格的绘制)
一、用函数绘制简单图形
import cv2
import numpy as np
import cv2
:导入OpenCV
库,这个库提供了很多图像处理和计算机视觉方面的功能
import numpy as np
:导入numpy
库,并简称为np
。numpy
是一个用于科学计算的Python库,它提供了多维数组对象和相应的操作。
1.画直线
img = np.zeros((512, 512, 3), dtype=np.uint8)
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
#显示图像
cv2.imshow('Line', img)
cv2.waitKey(0)
-
img = np.zeros((512, 512, 3), dtype=np.uint8)
:创建一个大小为512x512像素的三维数组,其中每个像素由三个颜色通道(红、绿、蓝)组成。dtype=np.uint8
表示数组的数据类型是无符号8位整数,这是图像处理中常用的数据类型,范围从0到255。 -
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
:使用OpenCV
的line
函数在图像上绘制一条线。这条线的起点是(0, 0),即图像的左上角,终点是(511, 511),即图像的右下角。(255, 0, 0)
是线条的颜色,表示蓝色。最后一个参数5
是线条的粗细。
PS:在
OpenCV
中,颜色的表示方式是BGR(蓝-绿-红),而不是常见的RGB(红-绿-蓝)。所以,当你使用(255, 0, 0)
这个颜色值时,实际上你绘制的是一条蓝色的线,因为255
代表蓝色通道的最大强度,而红色和绿色通道的强度都是0
。(具体数值可以查询BGR颜色对照表)
3.cv2.imshow('Line', img)
:使用OpenCV
的imshow
函数将图像显示在窗口中。窗口的标题是'Line',img
是要显示的图像。
4.cv2.waitKey(0)
:waitKey
函数使程序暂停,等待用户按键。参数0
表示无限期地等待一个按键。这个函数通常用来在显示图像后让用户有时间查看图像,直到按下任意键。
完整的代码如下:
import cv2
import numpy as np
img = np.zeros((512, 512, 3), dtype=np.uint8)
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
#显示图像
cv2.imshow('Line', img)
cv2.waitKey(0)
运行结果如图1:
2.画矩形
在已经学习了直线的绘制后矩形的绘制就更简单了,直接把上述代码中的
cv2.line() 改成cv2.rectangle() ;
cv2.imshow('Line', img) 改成cv2.imshow('Rectangle', img)
怎么样,是不是很简单?
这里需要注意一下,矩形的左上角和右下角的两个点的坐标通过下列式子中的两个括号来表示:(比如这里是从(100,100)到(300,300))。
cv2.rectangle(img, (100, 100), (300, 300), (255, 0, 0), 5)
最后输出的图形如图2:
如果想变成实心矩形,则将上述代码最后的5改成负数即可,如图3。
完整代码如下:
import cv2
import numpy as np
img = np.zeros((512, 512, 3), dtype=np.uint8)
cv2.rectangle(img, (100, 100), (300, 300), (255, 0, 0), -5) #实心矩形
#cv2.rectangle(img, (100, 100), (300, 300), (255, 0, 0), 5) #空心矩形
#显示图像
cv2.imshow('Rectangle', img)
cv2.waitKey(0)
3.画圆形
同理,只需要将绘制矩形的代码替换成圆形即可:
import cv2
import numpy as np
img = np.zeros((512, 512, 3), dtype=np.uint8)
#cv2.circle(img, (375 , 275), 100, (255, 0, 255), -2)#实心圆
cv2.circle(img, (375 , 275), 100, (255, 0, 255), 2)#空心圆
#显示图像
cv2.imshow('circle', img)
cv2.waitKey(0)
其中(375,275)表示圆心坐标,100表示半径,(255,0,255)表示颜色,2表示粗细。
输出图形分别如下:
二、绘制栅格地图
import cv2
import numpy as np
#画出画布,方框
# 定义图像的大小
img_size = 200 #总像素数
grid_size = 20 #每个栅格边长所占的像素数
# 创建白色背景的图像
img = np.ones((img_size, img_size, 3), np.uint8) * 255
# 绘制网格
for x in range(0, img_size, grid_size):
for y in range(0, img_size, grid_size):
# 绘制每个方框的边框
cv2.rectangle(img, (x, y), (x + grid_size, y + grid_size), (0, 0, 0), 1)
#显示图像
cv2.imshow('rectangle',img)
cv2.waitKey()
#将图像以图片的形式保存下来
# 保存图像的文件路径
save_path = 'shangeditu.png'
# 保存图像
cv2.imwrite(save_path, img)
print(f"图像已保存至:{save_path}")
这里绘制了一个10*10格的栅格地图(每个格子的长度是20个像素),采用的是白底黑线。将绘制的栅格地图保存下来,方便后续的调用 。
如果想在栅格中添加黑色障碍物,可以在画布上绘出黑色实心矩形。在绘制网格之前添加如下代码:
#增加黑色障碍物
cv2.rectangle(img,(60,60),(120,100),(0,0,0),-1
后续我会写一个关于在栅格地图中实现A*算法(python)的文章,想了解的小伙伴欢迎前来!
(如果写的哪里不对的,也非常希望大佬们能指出来,支持一下新人hh~)
标签:img,OpenCV,cv2,栅格,np,import,100,绘制,255 From: https://blog.csdn.net/2301_76360523/article/details/141719664