OpenCV在已有图片上画点

OpenCV是个计算机视觉和机器学习软件库。应用领域也比较广,包括图片识别,运动跟踪,计算机视觉等等。提供大量的Python接口。

在python中的安装:

pip install opencv-python

这里的案例是先使用Basemap画初始地图,然后在初始地图上画点。由于初始地图画的时间比较久,生成图片的数量也比较大,故先保存初始地图,利用plt转换经纬度坐标为像素坐标后,利用opencv加载已有图片画点。

画初始地图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import cv2 as cv

def load_map():
    fig = plt.figure(figsize=(2.65, 3),dpi=300)
    ax = fig.add_subplot(1,1,1)
    plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0, wspace=0)

    m = Basemap(llcrnrlon=118.05,llcrnrlat=24.4,urcrnrlon=118.2,urcrnrlat=24.57)
    m.readshapefile('island',name='island',drawbounds=True,linewidth=0.5,color='#862E21')

    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    ax.spines['left'].set_visible(False)
    return m, ax, fig

basemap, ax, fig = load_map()
x, y = basemap(station['lon'].to_list(), station['lat'].to_list())
basemap.scatter(x, y, marker='D', color='#B33F2D', s=10, zorder=0)
for i in tcd.index:
    lons, lats = to_loc(tcd['FENCE_LOC'][i])
    ax.plot(lons, lats, '-', lw=0.5, color='#3D698B', marker=None, zorder=2)
plt.savefig(PLOT + '{}.png'.format('Parking_Lots'))

这个Parking_Lots.png就是后面要在上面画点的图片。

把点的经纬度坐标转为像素坐标

df_shot = gj[gj.time == time]
x = df_shot['lon'].to_list()
y = df_shot['lat'].to_list()  # 获得x,y的经纬度坐标
basemap, ax, fig = load_map()

# transform coor to pixel
points, = ax.plot(x, y)
xi, yi = points.get_data()
xy_pixels = ax.transData.transform(np.vstack([xi, yi]).T)
xpix, ypix = xy_pixels.T
width, height = fig.canvas.get_width_height()
ypix = height - ypix  # for cv, (0,0) is at lower left while (0,0) is at upper right for others
xpix = xpix.astype('int')
ypix = ypix.astype('int')

注意:opencv(0,0)是在左下角,别的大多在右上角。所以有ypix = height - ypix的这一步

cv加载图片画点

img = cv.imread(PLOT + 'Parking_Lots.png')  # 读取图片
for xi, yi in zip(xpix, ypix):
    cv.circle(img, (xi, yi), 5, (0, 140, 255), -1)  # BGR in cv
    cv.imwrite(PLOT + 'Time_Panel.png', img)

注意:

  1. 如果想要窗口查看图片,需要用以下代码窗口保持:
cv.imshow('img',img)
cv.waitKey()
cv.destroyAllWindows()
  1. cv里面的颜色是 BGR,别的都是RGB模式
  2. cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
    cv2.circle(输入的图片data,圆心位置,圆的半径,圆的颜色,圆形轮廓的粗细(如果为正)负数(-1)表示要绘制实心圆,圆边界的类型,中心坐标和半径值中的小数位数)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值