Opencv-python从入门到放弃 —— 画图(3)

自己是一个菜鸡,希望通过写博客的方式提升自己,最近正好接触到了opencv,想把学习路程以博客的形式记录下来,也算是学习opencv的一种动力吧,好吧,话不多说,干就完了!

一、基础知识

  1. 既然图像的格式是一个ndarray,那我们完全可以通过numpy构造一个人造图像!但是有一个非常重要的一点就是数据类型,一定要对图像的数据类型进行初始化,一般就是’uint8’吧,即灰度范围为[0, 255]。
  2. 两点确定唯一的一条直线、一对对角坐标能够确定唯一的一个矩形、圆心和半径能够确定唯一的圆。

二、API

  1. 直线:cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img
  2. 矩形:cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img
  3. 圆:cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img
    基本上参数形式都是固定的:
    img: 指明要在哪个图片上画
    pt1,pt2,center是三个点,都是tuple类型,radius是正整数
    color: 指明什么颜色
    thickness: 线的厚度,单位是像素
    lineType: 线(曲线)的类型

三、 Demo

import cv2
import numpy as np
import os

our_image = np.zeros([300, 300, 3], dtype='uint8')  # 构造的是一个初始化为全黑的RGB图片噢
# 两条直线
cv2.line(our_image, (0, 0), (299, 299), (255, 255, 255), 3)
cv2.line(our_image, (0, 299), (299, 0), (255, 255, 255), 3)
# 两个矩形
cv2.rectangle(our_image, (5, 125), (35, 175), (0, 255, 0), 3)
cv2.rectangle(our_image, (264, 125), (294, 175), (0, 255, 0), -1)  # thickness是负数的时候表示实心
# 四个圆
h, w = our_image.shape[:2] #获取图像高,宽
center = (w // 2, h // 2)
for radius in range(0, 101, 25):
    cv2.circle(our_image, center, radius, (0, 0, 255), 3)
cv2.imwrite('operation.jpg', our_image)

运行结果:
operation

  1. 注意:前面我说到过opencv中的函数默认的坐标系的顺序和numpy里面是相反的,两者的原点都位于图像左上角,但是在opencv的函数中横轴是x轴,纵轴是y轴!而numpy中纵轴是第一维度,也就是x轴!这点一定要注意噢,记住只要是opencv中的函数用到了坐标就用opencv的坐标系就好了,其余情况就当是正常的numpy矩阵。
  2. 当要画实心图形的时候,只需将thickness参数设为-1就好了,

四、有趣的操作

our_image = np.zeros((300, 300, 3), dtype='uint8')
# 圆心,半径,颜色全部随机~画25个圆。
for num in range(25):
    radius = np.random.randint(5, 200)  # 圆心在[5, 199]之间
    # 不知道为什么tuple()不行,只能tolist()...
    color = np.random.randint(0, 256, size=(3,)).tolist() # 颜色三个数的数值都在[0, 255]上 
    centers = np.random.randint(0, 300, size=(2, )) # 圆心两个数的数值都在[0, 299]上
    cv2.circle(our_image, tuple(centers), radius, color, -1)
cv2.imwrite('operation.jpg', our_image)

运行结果:
operation

  1. 一直没搞懂 narray.tolist()和list(narray)有什么区别,那块只能tolist(),tuple()强制转换都不行。。。不知道为啥~。

猜你喜欢

转载自blog.csdn.net/Annihilation7/article/details/82503277
今日推荐