【问题标题】:Clone an image in cv2 python在 cv2 python 中克隆图像
【发布时间】:2013-05-08 03:18:26
【问题描述】:

我是opencv的新手,这里有个问题,与cpp中的cv::clone()作用相同的python函数是什么? 我只是尝试通过

得到一个 rect
    rectImg = img[10:20, 10:20]

但是当我在上面画一条线时,我发现这条线同时出现在 img 和 rectImage 上,那么,我该如何完成呢?

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    使用 python 3 和 opencv-python 4.4.0 版,以下代码应该可以工作:

    img_src = cv2.imread('image.png')
    img_clone = img_src.copy()
    

    【讨论】:

    • 这实际上是一个答案还是一个问题? “我尝试使用...”
    • 一个答案其实是@Ruli
    【解决方案2】:

    第一个答案是正确的,但您说您使用的是 cv2,它本质上使用 numpy 数组。因此,要制作一个完全不同的“myImage”副本:

    newImage = myImage.copy()
    

    以上就够了。无需导入 numpy。

    【讨论】:

      【解决方案3】:

      我最喜欢的方法是使用没有边框的 cv2.copyMakeBorder,就像这样。

      copy = cv2.copyMakeBorder(original,0,0,0,0,cv2.BORDER_REPLICATE)
      

      【讨论】:

      • copyMakeBorder 变体相对于常规的“复制”有什么好处?是否试图避免源代码中出现 nparrays(Python-OpenCV 矩阵是什么)的概念?
      【解决方案4】:

      您可以简单地使用 Python 标准库。对原图做一个浅拷贝,如下:

      import copy
      
      original_img = cv2.imread("foo.jpg")
      clone_img = copy.copy(original_img)
      

      【讨论】:

      • 浅拷贝是有害的(RAM 所有权不明确,访问性能不明确等)。
      【解决方案5】:

      如果你使用cv2,正确的方法是在Numpy中使用.copy()方法。它将创建您需要的数组的副本。否则它将只生成该对象的视图。

      例如:

      In [1]: import numpy as np
      
      In [2]: x = np.arange(10*10).reshape((10,10))
      
      In [4]: y = x[3:7,3:7].copy()
      
      In [6]: y[2,2] = 1000
      
      In [8]: 1000 in x
      Out[8]: False     # see, 1000 in y doesn't change values in x, parent array.
      

      【讨论】:

      • 它们只是 0-100 范围内的数字。只需在每一步之后打印xy。然后你就会明白了。
      猜你喜欢
      • 2011-08-07
      • 2012-02-10
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多