Clone an image in cv2 Python
Question:
I’m new to OpenCV. What is the Python function which act the same as cv::clone() in C++?
I just try to get a rect by
rectImg = img[10:20, 10:20]
but when I draw a line on it, I find the line appear both on img and the rectImage, so, how can I get this done?
Answers:
If you use cv2
, the correct method is to use the .copy()
method in NumPy. It will create a copy of the array you need. Otherwise it will produce only a view of that object.
For example:
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, the parent array.
You can simply use the Python standard library. Make a shallow copy of the original image as follows:
import copy
original_img = cv2.imread("foo.jpg")
clone_img = copy.copy(original_img)
My favorite method uses cv2.copyMakeBorder with no border, like so.
copy = cv2.copyMakeBorder(original,0,0,0,0,cv2.BORDER_REPLICATE)
Abid Rahman K’s answer is correct, but you say that you are using cv2 which inherently uses NumPy arrays. So, to make a complete different copy of say "myImage":
newImage = myImage.copy()
The above is enough. There isn’t any need to import NumPy (numpy
).
Using Python 3 and opencv-python version 4.4.0, the following code should work:
img_src = cv2.imread('image.png')
img_clone = img_src.copy()
I’m new to OpenCV. What is the Python function which act the same as cv::clone() in C++?
I just try to get a rect by
rectImg = img[10:20, 10:20]
but when I draw a line on it, I find the line appear both on img and the rectImage, so, how can I get this done?
If you use cv2
, the correct method is to use the .copy()
method in NumPy. It will create a copy of the array you need. Otherwise it will produce only a view of that object.
For example:
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, the parent array.
You can simply use the Python standard library. Make a shallow copy of the original image as follows:
import copy
original_img = cv2.imread("foo.jpg")
clone_img = copy.copy(original_img)
My favorite method uses cv2.copyMakeBorder with no border, like so.
copy = cv2.copyMakeBorder(original,0,0,0,0,cv2.BORDER_REPLICATE)
Abid Rahman K’s answer is correct, but you say that you are using cv2 which inherently uses NumPy arrays. So, to make a complete different copy of say "myImage":
newImage = myImage.copy()
The above is enough. There isn’t any need to import NumPy (numpy
).
Using Python 3 and opencv-python version 4.4.0, the following code should work:
img_src = cv2.imread('image.png')
img_clone = img_src.copy()