【问题标题】:How do I dereference in python? (Image Processing with openCV)如何在 python 中取消引用? (使用 openCV 进行图像处理)
【发布时间】:2012-03-20 16:13:23
【问题描述】:

我一直在互联网上寻找一个简单的细化算法,我偶然发现了这个:Thinning algorithm 问题是,我对取消引用运算符没有太多经验。另外,我的项目是在 python 中,它有不同的处理这种情况的方式。所以我有几个问题

1:这段代码在做什么?

void myThinningInit (CvMat ** kpw, CvMat ** kpb)
  {
    / / Kernel for cvFilter2D
    / / The algorithm kpw kernel binary image and it has become a matching white, black,
    / / Convolution is divided into two sets of binary image was inverted kpb kernel, then take the AND
    for (int i = 0; i <8; i + +) {
      * (Kpw + i) = cvCreateMat (3, 3, CV_8UC1);
      * (Kpb + i) = cvCreateMat (3, 3, CV_8UC1);
      cvSet (* (kpw + i), cvRealScalar (0), NULL);
      cvSet (* (kpb + i), cvRealScalar (0), NULL);
    }.....

还有 2:如何将这个内核创建转换成 python?

他最终制作了 8 个内核,但我不知道它们的矩阵形式是什么样的。 我不明白“* (kpw + i)”或“* (kpb + i)”在程序的宏伟计划中做了什么。

3) 我可以制作内核并将它们存储在一个列表中吗?如果是这样,我该怎么做?

更新:

k = [1, 2, 3, 5, 6, 7, 8]
kpw = []
kpb = []

for i in k:
    kpw.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1)
    kpb.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1)
    cv.cvSet (kpw [i], cv.RealScalar (0), cv.NULL)
    cv.cvSet (kpb [i], cv.RealScalar (0), cv.NULL)

起初我不只是有 kpw [i],它给我一个错误。在快速谷歌搜索后,我发现你需要先索引数组,他们这样做的方式是通过追加。我尝试了这段代码以获得 8 个 3x3 大小的基本内核,但我收到了这个错误:

Traceback(最近一次调用最后一次):

文件“/home/krtzer/Documents/python_scripts/thinning.py”,第 14 行,在 kpw.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1) TypeError: 'builtin_function_or_method' 对象不支持项目分配

这是否意味着我不能在列表中包含矩阵?

【问题讨论】:

  • Kpw(大写的K)是故意的(与kpw(小写的k)不同)?
  • This C algorithm 可能更容易理解。 AFAIK OpenCV 不会做这样的事情,在这里对您没有太大帮助(可能除了图像的初始加载)。
  • @mathematical.coffee 这很难说,因为我是从源代码中获取的。将其大写是没有意义的,因为它从未在代码的其他任何地方声明或使用过。感谢你们如此迅速地对此做出回应。

标签: c++ python image-processing opencv dereference


【解决方案1】:

我用python做了一个新的。 Thinning(Python)

【讨论】:

    【解决方案2】:

    编辑 - 在这个答案中犯了一个(相当大的)错误,将解释

    kpwkpb 中看起来都是CvMats 的数组。

    假设我在 Python 中创建了一个数组列表 kpw = []

    *(kpw + i) = ... 就像说kpw[i] = ...

    看起来像其他代码将内核列表初始化为 0 的 3x3 矩阵,所以你可以这样做:

    # make a list of 8  3x3 matrices of 0.
    kpw = []
    for i in xrange(8):
        kpw.append(np.zeros((3,3)))
        kpb.append(np.zeros((3,3)))
    

    注意:我以前有:

    kpw = [np.zeros((3,3))] * 8
    kpb = [np.zeros((3,3))] * 8
    

    这是错误!它在kpw 内产生8 个引用相同的矩阵,因此修改kpw[0]修改所有其他kpw[i]


    那么cvSet2D(*(kpb+0), 0, 0, cvRealScalar(0));可以翻译成:

    kpb[0][0,0] = 0
    

    因为*(kpb+0)抓取kpg[0]中的矩阵,所以0,0表示矩阵的元素0,0,0为值。

    所以:每次看到 *(kpb+i) 时,只需替换 kpb[i],你应该会找到翻译该代码的地方。

    【讨论】:

    • 1.示例代码中的循环使 8 个矩阵不是 7 和 2。您使用同一个矩阵 7 次,这几乎肯定是一个可怕的错误!
    • 感谢 1 中的捕获。至于 2.,OP 中的代码只是将 8 个(感谢)矩阵全部初始化为 0。 python 列表 kpw 将包含 8 个单独的矩阵,修改(比如)kpw[0]也修改 kpw[1]
    • 您可能需要仔细检查。比较id(kpw[0])id(kpw[1])
    • D'oh,当我在 python 解释器中尝试这个时,我没有正确读取输出。你说得对。我会留下答案,作为做什么的例子。
    【解决方案3】:

    取消引用只是创建一个矩阵,而不初始化它的数据。数据由cvSet (* (kpw + i), cvRealScalar (0), NULL) 等行手动设置为零。

    在 python 中,您可以使用numpy.zeros 一次性完成相同的操作,然后使用cv.fromarray。或者,使用x = cv.CreateMat(3, 3, cv.CV_8UC1),然后使用cv.set(x, 0.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多