Python-Opencv 基本操作(一)

下面完整代码在github仓库:传送门


一、在图片上画线

import cv2

img = cv2.imread("1.jpg", 0)  # 默认1为真彩色,0为灰色

# opencv的图像模式是BGR
cv2.line(img, (10, 10), (100, 100), [0, 0, 255], 3)
cv2.imshow("", img)
cv2.waitKey(10000)
cv2.destroyAllWindows()

二、图像通道BGR转换RGB

import cv2
from PIL import Image

img = cv2.imread("1.jpg")

cv2.line(img, (10, 10), (100, 100), [0, 0, 255], 3)
cv2.rectangle(img, (10, 10), (100, 100), [0, 0, 255], 3)

# h, w, c
# img = img[:, :, ::-1]  # ::-1表示将RGB倒序输出
# BGR通道的图像转换成RGB的图像
img = img[..., ::-1]
img = Image.fromarray(img)
img.show()

三、画矩形框

import cv2
from PIL import Image

img = cv2.imread("1.jpg")
cv2.line(img, (10, 10), (100, 100), [0, 0, 255], 3)
cv2.rectangle(img, (10, 10), (100, 100), [0, 0, 255], 3)

cv2.imshow("", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、图片变形

import cv2

img = cv2.imread("1.jpg")
# print(type(img))
# print(img)

img_size = img.shape
print(img_size)
img = cv2.resize(img, (img_size[1]//2, img_size[0]//2))

cv2.imshow("img", img)
cv2.waitKey(10000)
cv2.destroyAllWindows()
cv2.imwrite("2.jpg", img)

五、opencv转换到PIL

import cv2
from PIL import Image
import numpy as np

# 从opencv转换到PIL
img_arr = cv2.imread("3.jpeg")
img_arr = cv2.cvtColor(img_arr, cv2.COLOR_BGR2RGB)  # 改变通道
img = Image.fromarray(img_arr)  # 改变图像数据类型
img.show()

六、利用opencv播放视频

import cv2

path = "1.mp4"  # 本地视频路径
# path = r"http://vfx.mtime.cn/Video/2019/03/19/mp4/190319125415785691.mp4"  # 在线视频路径

# cap = cv2.VideoCapture(0)  # 调取内置摄像头
cap = cv2.VideoCapture(path)  # 获取视频对象

fps = cap.get(cv2.CAP_PROP_FPS)  # 从视频对象中获取帧数
print(fps)

w = int(cap.get(3))  # 获取图片的宽度
h = int(cap.get(4))  # 获取图片的高度
# print(w)
# print(h)


fourc = cv2.VideoWriter_fourcc(*"DVIX")  # 视频格式
out = cv2.VideoWriter("2.mp4", fourc, fps, (w, h))  # 写入视频格式

font = cv2.FONT_HERSHEY_COMPLEX
# frame表示读出的每一张图片, ret表示这一张图片是否存在
while True:
    ret, frame = cap.read()
    # 将十六进制数据转成 二进制数据
    if cv2.waitKey(int(1000 / fps)) & 0xFF == ord("q"):  # 视频在播放的过程中按键,循环会中断)。
        break
    elif ret == False:  # 视频播放完了,循环自动中断。
        break
    cv2.rectangle(frame, (200, 50), (300, 150), [0, 0, 255], 3)
    out.write(frame)

    # 前面的1表示字体大小,后面的1表示字体厚度, lineType抗锯齿
    cv2.putText(frame, "beautiful girl 啊", (100, 100), font, 1, (0, 0, 255), 1, lineType=cv2.LINE_AA)
    cv2.imshow("", frame)

cap.release()  # 将视频关了
cv2.destroyAllWindows()

七、PIL转换到Opencv

import cv2
from PIL import Image
import numpy as np

# 从PIL转换到opencv
img = Image.open("3.jpeg")
img_arr = np.array(img)  # 从图像数据转成numpy数据类型

img_arr = cv2.cvtColor(img_arr, cv2.COLOR_RGB2BGR)  # 转通道
cv2.imshow("", img_arr)
cv2.waitKey(0)

img_arr = img_arr[..., ::-1]

cv2.imshow("", img_arr)
cv2.waitKey(0)
cv2.destroyAllWindows()

八、合成图片通道

import cv2
from PIL import Image

img = cv2.imread("1.jpg")

b, g, r = cv2.split(img)

cv2.imshow("b", b)  # 显示灰度图
cv2.imshow("g", g)
cv2.imshow("r", r)

img = cv2.merge([g, r, b])  # 合成通道
cv2.imshow("", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

九、给视频图像加滤波

import cv2
import numpy as np
from PIL import Image, ImageFilter

cap = cv2.VideoCapture("1.mp4")

fps = cap.get(cv2.CAP_PROP_FPS)
while True:
    ret, frame = cap.read()
    img_arrs = frame[..., ::-1]
    imgs = Image.fromarray(img_arrs)

    img = imgs.filter(ImageFilter.MinFilter(5))
    img_arr = np.array(img)[..., ::-1]
    cv2.imshow("", img_arr)

    if cv2.waitKey(int(1000/fps)) & 0xFF == ord("q"):
        break
    elif ret == False:
        break

cap.release()  # 关闭视频
cv2.destroyAllWindows()  # 关闭窗口

十、视频图像变灰度

import cv2
import numpy as np
from PIL import Image, ImageFilter

cap = cv2.VideoCapture("1.mp4")

fps = cap.get(cv2.CAP_PROP_FPS)
while True:
    ret, frame = cap.read()
    # img1 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    img1 = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  # HSV是连续的色彩空间

    cv2.imshow("", img1)

    if cv2.waitKey(int(1000/fps)) & 0xFF == ord("q"):
        break
    elif ret == False:
        break

cap.release()  # 关闭视频
cv2.destroyAllWindows()  # 关闭窗口

十一、找视频图像轮廓

import cv2
import numpy as np
from PIL import Image, ImageFilter

cap = cv2.VideoCapture("1.mp4")

fps = cap.get(cv2.CAP_PROP_FPS)
while True:
    ret, frame = cap.read()

    img_arr = frame[..., ::-1]
    img1 = Image.fromarray(img_arr)

    # img2 = img1.filter(ImageFilter.CONTOUR)  # 图像轮廓
    # img2 = img1.filter(ImageFilter.EMBOSS)
    img2 = cv2.cvtColor(img_arr, cv2.COLOR_RGB2GRAY)

    img3_arr = np.array(img2)[..., ::-1]  # 转数据类型和通道
    cv2.imshow("", img3_arr)

    if cv2.waitKey(int(1000/fps)) & 0xFF == ord("q"):
        break
    elif ret == False:
        break

cap.release()  # 关闭视频
cv2.destroyAllWindows()  # 关闭窗口

十二、通道分离

import cv2
import numpy as np

img_arr = np.empty([400, 400, 3], np.uint8)  # 生成空矩阵
print(img_arr)

# [0, 0, 255]
img_arr[..., 0] = 0
img_arr[..., 1] = 0
img_arr[..., 2] = 255  # 将第三个通道的像素值填为255

cv2.imshow("", img_arr)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
from PIL import Image

# 将图像变为单通道
img = cv2.imread("1.jpg")

img[..., 1] = 0
img[..., 2] = 0

cv2.imshow("", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

十三、通道填值

import cv2
import numpy as np

img_arr = np.zeros([400, 400, 3], np.uint8)
# img_arr = np.ones([400, 400, 3])

# img_arr = np.arange(400*400*3).reshape([400, 400, 3]) / (400*400*3)
# img_arr = np.random.rand(400, 400, 3)
# img_arr = np.random.randn(400, 400, 3)
# img_arr = np.random.normal(0, 0.5, (400, 400, 3))

cv2.imshow("", img_arr)  # opencv中 像素值填0-1之间的值
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要进行相机标定的目的是为了去掉相机透镜畸变,使拍摄的图像更加准确,对于使用opencv库的python用户来讲,相机标定也是一项常规操作。以下是python-opencv相机标定的教程: 1. 收集标定图片:准备至少10到20张不同角度和位置的图片,要保证图片中有棋盘格子等模板。 2. 提取角点特征:用cv2.findChessboardCorners()函数提取棋盘格子的角点,这里用到的是cv2自带的提取工具。 3. 标定镜头:用cv2.calibrateCamera()函数对相机进行标定,得出相机内参矩阵等相关参数。 4. 存储标定结果: 使用cv2.FileStorage()函数存储标定参数。 5. 测试标定结果:使用cv2.undistort()函数果进行畸变校正,并观察校正后的图像是否有改善。 6. 应用标定结果:将标定结果应用到实际项目中,在程序中调用标定参数可以有效降低图像畸变,提高图像质量。 以上是python-opencv相机标定的教程,如果有需要的话,还可以使用均匀灰度图像等其他方式进行标定。通常情况下,一次标定的结果可以使用长时间,从而提高整个项目的精确度。 ### 回答2: Python-OpenCV相机标定教程是小型项目的标准。 在机器视觉和计算机视觉中,相机标定非常重要,这是获取全面、准确的数据的基础。相机标定的目的是为了减少照相机视角失真,提高拍摄到的图像质量,从而更好地支持照相机的图像处理。它的主要目的是矫正图像中的畸变并确定相机的内参和外参。 Python-OpenCV相机标定教程可以在Python编程语言中使用OpenCVPython库实现。这个过程包括多个步骤,如获取棋盘格角点、标定相机、计算相机的投影矩阵等。 在相机标定过程中,需要拍摄多张棋盘格图像。首先,必须定义棋盘格行列数量,然后手动测量棋盘格方格大小并加载图像到OpenCVPython中。接下来,寻找图像中棋盘格的角点,这些角点可以被处理以消除任何镜头失真。使用这些图像来标定相机并计算相机的投影矩阵。最后,保存相机内参和外参以对未来的图像应用重新计算。 相机标定的作用是消除由透视等导致的图像质量降低,从而使图像更清晰、更准确。Python-OpenCV相机标定教程为开发者提供了实现相机标定的基础,使他们可以快速构建照相机内参与外参算法并为数据处理提供基础。 ### 回答3: Python-OpenCV相机标定教程 OpenCV是一种非常流行的计算机视觉库,具有许多强大的功能,包括相机标定。相机标定是将相机的内部参数和畸变参数计算出来,以便更好地将2D图像转换为3D场景。在此教程中,我们将介绍使用Python-OpenCV库进行相机标定的步骤。 第一步:获取棋盘格图像 在进行相机标定之前,需要获取一些棋盘格图像。为了获得尽可能准确的结果,您需要将棋盘格图像从不同的角度和位置拍摄,并确保棋盘格图像足够清晰。我们建议至少拍摄10张不同的图像。 第二步:检测棋盘格角点 使用OpenCV中的函数cv2.findChessboardCorners()可以检测棋盘角点。它需要棋盘的大小和图像。如果检测到角点,函数将返回True,并将角点位置存储在一个数组中。 第三步:计算相机内部参数和畸变参数 为了计算相机的内部参数和畸变参数,需要使用OpenCV中的函数cv2.calibrateCamera()。这个函数接受一个由棋盘格图像和对应的角点位置组成的列表,并返回摄像机矩阵,畸变系数和旋转矩阵。 第四步:评估相机标定结果 在评估相机标定结果时,您需要计算误差,这可以通过一个简单的公式完成。误差是指每个棋盘格角点的图像坐标和标准(真实)坐标之间的平均距离。您还可以使用OpenCV可视化函数来显示标定结果。 总结 这就是使用Python-OpenCV进行相机标定的基本步骤。相机标定是一个基本任务,但是它对于实现更复杂的计算机视觉任务非常重要。标定成功后,您可以更准确地进行2D到3D坐标的变换,从而实现更准确的跟踪和测量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值