当前位置: 首页 > 知识库问答 >
问题:

使用加速器规范化视差图像

彭霄
2023-03-14

我有一个视差图像,我正在使用下面的示例代码对其进行规范化,但速度非常慢。我需要使用一些加速器,比如定制的CIFilter或任何其他技术,但我不知道怎么做?我目前正在用CIContext()运行代码,它正在CPU上运行(不确定)。有没有办法在GPU上运行它并在没有定制CIfilter的情况下加速?以下是当前代码:

extension CVPixelBuffer {

  func normalize() {

    let width = CVPixelBufferGetWidth(self)
    let height = CVPixelBufferGetHeight(self)

    CVPixelBufferLockBaseAddress(self, CVPixelBufferLockFlags(rawValue: 0))

    let baseAddr = CVPixelBufferGetBaseAddress(self)!
    let floatBuffer = unsafeBitCast(CVPixelBufferGetBaseAddress(self), to: UnsafeMutablePointer<Float>.self)

    var minPixel: Float = 1.0
    var maxPixel: Float = 0.0

    for y in 0 ..< height {
      for x in 0 ..< width {
        let pixel = floatBuffer[y * width + x]
        minPixel = min(pixel, minPixel)
        maxPixel = max(pixel, maxPixel)
      }
    }


    let range = maxPixel - minPixel

    for y in 0 ..< height {
      for x in 0 ..< width {
        let pixel = floatBuffer[y * width + x]
        floatBuffer[y * width + x] = (pixel - minPixel) / range
      }
    }

    CVPixelBufferUnlockBaseAddress(self, CVPixelBufferLockFlags(rawValue: 0))
  }
}

共有3个答案

堵毅然
2023-03-14

我使用加速框架vDSP向量函数来标准化视差。在gitHub中查看一个经过修改的PhotoBrowse,以获得一个可用的演示。

下面是两个函数中的相关代码

extension CVPixelBuffer {
    func vectorNormalize( targetVector: UnsafeMutableBufferPointer<Float>) -> [Float] {
        // range = max - min
        // normalized to 0..1 is (pixel - minPixel) / range

        // see Documentation "Using vDSP for Vector-based Arithmetic" in vDSP under system "Accelerate" documentation

        // see also the Accelerate documentation section 'Vector extrema calculation'
        // Maximium static func maximum<U>(U) -> Float
        //      Returns the maximum element of a single-precision vector.

        //static func minimum<U>(U) -> Float
        //      Returns the minimum element of a single-precision vector.


        let maxValue = vDSP.maximum(targetVector)
        let minValue = vDSP.minimum(targetVector)

        let range = maxValue - minValue
        let negMinValue = -minValue

        let subtractVector = vDSP.add(negMinValue, targetVector)
            // adding negative value is subtracting
        let result = vDSP.divide(subtractVector, range)

        return result
    }

    func setUpNormalize() -> CVPixelBuffer {
        // grayscale buffer float32 ie Float
        // return normalized CVPixelBuffer

        CVPixelBufferLockBaseAddress(self,
                                     CVPixelBufferLockFlags(rawValue: 0))
        let width = CVPixelBufferGetWidthOfPlane(self, 0)
        let height = CVPixelBufferGetHeightOfPlane(self, 0)
        let count = width * height

        let bufferBaseAddress = CVPixelBufferGetBaseAddressOfPlane(self, 0)
            // UnsafeMutableRawPointer

        let pixelBufferBase  = unsafeBitCast(bufferBaseAddress, to: UnsafeMutablePointer<Float>.self)

        let depthCopy  =   UnsafeMutablePointer<Float>.allocate(capacity: count)
        depthCopy.initialize(from: pixelBufferBase, count: count)
        let depthCopyBuffer = UnsafeMutableBufferPointer<Float>(start: depthCopy, count: count)

        let normalizedDisparity = vectorNormalize(targetVector: depthCopyBuffer)

        pixelBufferBase.initialize(from: normalizedDisparity, count: count)
            // copy back the normalized map into the CVPixelBuffer

        depthCopy.deallocate()
//        depthCopyBuffer.deallocate()

        CVPixelBufferUnlockBaseAddress(self, CVPixelBufferLockFlags(rawValue: 0))

        return self

    }

}
周健
2023-03-14

对于您的用例,vImage可能是最好的选择。参见本答案中的选项3。

在核心图像中也有这样做的方法。我会想象使用CIareaMinMax过滤器来获得极值,然后使用一些巧妙的混合来归一化。如果你愿意,我可以详细说明。

戴博
2023-03-14

像素值为Float值,因此也可以使用vDSP。

vDSP_minvvDSP_maxv计算极值,并且:

floatBuffer[y * width + x] = (pixel - minPixel) / range

可以替换为vDSP_vasm(需要乘以范围的倒数)。

查看执行此计算的vDSP_normalize可能也很有用:

            m = sum(A[n], 0 <= n < N) / N;
            d = sqrt(sum(A[n]**2, 0 <= n < N) / N - m**2);

            if (C)
            {
                // Normalize.
                for (n = 0; n < N; ++n)
                    C[n] = (A[n] - m) / d;
            }

 类似资料:
  • 我想使用Batchnormalization来规范化批次维度,但keras中的批次维度自然是无维度的。那我该怎么办呢。 keras示例显示,conv2d的轴为-1,这表示通道尺寸。 轴:整数,应规格化的轴(通常是特征轴)。例如,在具有data\u format=“channels\u first”的Conv2D层之后,在BatchNormalization中设置axis=1。

  • 主要内容:范式的类型规范化是在数据库中组织数据的过程。 规范化用于最小化关系或关系集的冗余。 它还用于消除插入,更新和删除异常等不良特性。 规范化将较大的表分成较小的表,并使用关系链接它们。 普通表单用于减少数据库表中的冗余。 范式的类型 有四种类型的范式: 范式 描述说明 1NF 如果它包含原子值,则关系为第范式(1NF)。 2NF 如果它在1NF中,则关系将在2NF中,并且所有非关键属性完全依赖于主键。 3NF

  • 问题内容: 在Python中,是否存在标准化unicode字符串的标准方法,以使其仅包含可用于表示它的最简单的unicode实体? 我的意思是,一些东西,想翻译的顺序来? 查看问题出在哪里: 但现在: 当然,我可以遍历所有字符并进行手动替换等,但是效率不高,我敢肯定我会错过一半的特殊情况,并且会犯错误。 问题答案: 该模块提供一个功能,您要标准化为NFC格式: NFC或“普通形式组合”返回组成的字

  • 问题内容: 在Java中创建XML规范格式的最简单方法是什么?你有一些完成的代码吗?我在网上找到了几个链接,例如this,this和this,但我无法使其正常工作:/ 谢谢, 伊万 编辑:我使用了在那里提出的规范化器,但是得到了奇怪的结果。更精确地说,此方法不会删除元素之间的空格…这就是我得到的: 问题答案: Apache XML Security项目 的Canonicalizer类:

  • 非规范化数据不存储规范化的数据。换句话说非规范化意味着相同数据的多个拷贝同时存在。 上一章中,我们在帖子中非规范化评论总数,以避免每次都加载所有的评论。在数据建模意义上说这是冗余的,因为我们可以通过计数每个评论,随时计算出该总数(当不考虑运行速度)。 非规范化通常意味着额外的开发工作。在例子中,我们每次添加或删除评论时,还需要同时更新相关的帖子,以确保 commentsCount 字段保持准确。这

  • 支持项 后端数据库为 MySQL、Oracle、PostgreSQL、SQLServer; 用户需要对数据库表中某个或多个列进行加密(数据加密 & 解密); 兼容所有常用SQL。 不支持项 用户需要自行处理数据库中原始的存量数据、洗数; 使用加密功能+分库分表功能,部分特殊SQL不支持,请参考SQL使用规范; 加密字段无法支持比较操作,如:大于小于、ORDER BY、BETWEEN、LIKE等;