分类 机器视觉 下的文章

OpenCV图像读取后,默认是预处理为HWC形状,而在PyTorch中,希望的是CHW形状; 另一方面,在通道顺序上,OpenCV默认是BGR的顺序,而在PyTorch的张量处理环节,我们一般希望的是RGB顺序。这里就涉及到了数据处理和转换。

OpenCV图像到PyTorch张量的转换

我们先模拟一个高度为2,宽度为3的彩色图像:

from torch import tensor

a = torch.randint(low=0, high=255, size=(2, 3, 3))

这里的a似于:

tensor([[[ 58, 223,  24], [ 35, 116, 249], [ 81, 220, 168]],
        [[242, 169, 149], [149,  87, 167], [165,  66,  88]]])

如果这个数据是从OpenCV读取过来,那么最内层通道顺序是BGR

为了得到RGB,我们可以将最内侧倒排一下:

b = a[:, :, [2,1,0]]

结果类似于:

tensor([[[ 24, 223,  58], [249, 116,  35], [168, 220,  81]],
        [[149, 169, 242], [167,  87, 149], [ 88,  66, 165]]])

但问题是,上面的张量形状是 (H,W,C),而在PyTorch中,我们期望的是(C,H,W)。现在我们将它拆分重排成RGB三个通道,其中每个通道都是一个2*3灰度图:

c = b.permute(2,0,1 )
print(c)

结果类似于:

tensor([
        # R通道
        [[ 24, 249, 168],
         [149, 167,  88]],         
        # G通道
        [[223, 116, 220],
         [169,  87,  66]],
        # B通道
        [[ 58,  35,  81],
         [242, 149, 165]]])

一个数据集加载示例

在《Modern Computer Vision》中,讲解了使用VGG16进行迁移学习,然后用于猫狗分类的示例。一方面VGG16预训练模型是在ImageNet数据集上训练得来的,其中所有图像都被缩放为 224 × 224 作为输入。为了充分利用预训练的权重,我们需要把训练的输入图像调整为相同大小。

阅读剩余部分

scikit-image 提供了一个match_template()函数,不过这个函数的定位并不是像VisionPro中的PMAlign(或者VisionMaster中的模板匹配),它不是一个端到端的工具,而是输出一个用模板滑过图像窗口形成的相关系数矩阵:即结果是一个矩阵,每个值表示在相应窗口位置时,模板与图像窗口的相关性。

这个函数的作用类似于我们手写一个人脸检测模块时,在第一阶段构建的人脸分类+滑动窗口的功能——即输出每个位置的得分,以表示每个区域是否存在人脸(或者存在人脸的概率)。但是随之而来的问题是,位置相近的窗口会有多个,但是它们都是同一个实体对象。这篇笔记组合了match_template()NMS算法,实现一个端到端的模板匹配功能。

实现对象

我们今天的实验对象是scikit-image官方的硬币示例:

image = data.coins()
coin = image[170:220, 75:130]

fig, ax = pyplot.subplots(1, 2)

ax0: axes.Axes = ax[0]
ax0.imshow(image, cmap='gray')
ax0.set_title("image")

ax1: axes.Axes = ax[1]
ax1.imshow(coin, cmap='gray')
ax1.set_title("template")

scikit-image模板匹配-截图1.PNG

阅读剩余部分

工业机器人用户坐标系是以机器人坐标系为参考,通过平移X、Y、Z生成用户坐标系原点,而后依次转动A、B、C三个轴得到。这里的机器人坐标系以底座为中心原点。

除了用户坐标系之外,工业机器人还有几个常见的直角坐标系:

  • 法兰坐标系:以法兰中心为原点,z轴垂直法兰面向外。
  • 工具坐标系:以法兰坐标系为参考,通过平移X、Y、Z生成工具坐标系的原点(Tool Center PointTCP), 而后依次转动A、B、C三个轴得到。

尽管从概念上讲,用户坐标系本身似乎和工具无关,但是用户坐标系却离不开工具坐标系。

阅读剩余部分

问题

考虑空间中有一个固定的点\(\vec{u}\)。现在建立一套坐标系\(A\),在坐标系\(A\)中,\(\vec{u}\)可以表示成\(\alpha_1 \vec{a_1} + ... + \alpha_n \vec{a_ n}\)。

现在坐标系\(A\)之外,再另建一套坐标系\(B\),基底是\(\vec{b_1}\), ... , \(\vec{b_n}\),问如何求点\(\vec{u}\)在\(B\)里的坐标?

记号和术语

由于涉及多套坐标系的转换,我们引入记号\([\vec{u}]_A\)表示向量\(\vec{u}\)在坐标系\(A\)下的各基向量的线性组合。

注意,\([\vec{u}]_A\)和\([\vec{u}]_B\)本质上描述的是同一个向量对象,你可以理解成我们在不同坐标系下为同一个物理点其起了不同的名字。

阅读剩余部分

本文是机器视觉2D引导定位的第五篇。本文讲述的核心内容是,综合之前的理论知识,练习使用VisionMaster进行单点抓放偏移计算,并用VisionPro自定义工具实现同样的功能。

标定

根据之前讲述的方法,执行12点标定(9点平移+3点旋转),并收集相应照片和对应的物理坐标:

VPro和VMaster交叉验证-采样图片截图.PNG

Hik VisionMaster 得到的标定文件为:

阅读剩余部分