Given the coordinates of four arbitrary points in an image (which are guaranteed to form a rectangle), I want to extract the patch that they represent and get a vectorized (flat) representation of the same. How can I do this?
I saw the answer to this question and using it I am able to reach to the patch that I require. For example, given the image coordinates of the 4 corners of the green rectangle in this image:
I am able to get to the patch and get something like:
using the following code:
p1 = (334,128)
p2 = (438,189)
p3 = (396,261)
p4 = (292,200)
pts = np.array([p1, p2, p3, p4])
mask = np.zeros((img.shape[0], img.shape[1]))
cv2.fillConvexPoly(mask, pts, 1)
mask = mask.astype(np.bool)
out = np.zeros_like(img)
out[mask] = img[mask]
patch = img[mask]
cv2.imwrite(img_name, out)
However, the problem is that the patch
variable that I obtain is simply an array of all pixels of the image that belong to the patch, when the image is read as a matrix in row-major order.
What I want is that patch
variable should contain the pixels in the order they can form a genuine image so that I can perform operations on it. Is there an opencv function that I should be aware of that would help me in doing this?
Thanks!
This is how you can implement this:
Code:
Result:
Next, the black areas in the image can be easily cropped by removing all rows/columns that are 100% black.
Final result:
Code: