Asked  6 Months ago    Answers:  5   Viewed   115 times

How can I crop images, like I've done before in PIL, using OpenCV.

Working example on PIL

im ='0.png').convert('L')
im = im.crop((1, 1, 98, 33))'_0.png')

But how I can do it on OpenCV?

This is what I tried:

im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)

But it doesn't work.

I think I incorrectly used getRectSubPix. If this is the case, please explain how I can correctly use this function.



It's very simple. Use numpy slicing.

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
Tuesday, June 1, 2021
answered 6 Months ago

I was able to get this to work using Python 2.7.13 and opencv-python==

Here is the code for it.

import cv2
import numpy as np
import sys

if len(sys.argv) < 3:
    print 'Usage: python <template.png> <image.png>'

template_path = sys.argv[1]
template = cv2.imread(template_path, cv2.IMREAD_UNCHANGED)
channels = cv2.split(template)
zero_channel = np.zeros_like(channels[0])
mask = np.array(channels[3])

image_path = sys.argv[2]
image = cv2.imread(image_path, cv2.IMREAD_UNCHANGED)

mask[channels[3] == 0] = 1
mask[channels[3] == 100] = 0

# transparent_mask = None
# According to, we can only use
# All methods can be seen here:
method = cv2.TM_SQDIFF  # R(x,y) = sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2 (essentially, sum of squared differences)

transparent_mask = cv2.merge([zero_channel, zero_channel, zero_channel, mask])
result = cv2.matchTemplate(image, template, method, mask=transparent_mask)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
print 'Lowest squared difference WITH mask', min_val

# Now we'll try it without the mask (should give a much larger error)
transparent_mask = None
result = cv2.matchTemplate(image, template, method, mask=transparent_mask)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
print 'Lowest squared difference WITHOUT mask', min_val

Here it is as a gist.

Essentially, you need to make sure you're using the right matching method.

Wednesday, August 4, 2021
answered 4 Months ago

For future readers, the code does work it was just that my image was so blurry, the above code had no visible effect!

Saturday, August 14, 2021
answered 4 Months ago

Use Graphics.DrawImage Method (Image, RectangleF, RectangleF, GraphicsUnit) method.

    Dim fileName = "C:file.jpg"
    Dim CropRect As New Rectangle(100, 0, 100, 100)
    Dim OriginalImage = Image.FromFile(fileName)
    Dim CropImage = New Bitmap(CropRect.Width, CropRect.Height)
    Using grp = Graphics.FromImage(CropImage)
        grp.DrawImage(OriginalImage, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
    End Using
Monday, August 23, 2021
answered 4 Months ago

MP4V or MPEG-4 part 2 is not supported by most browsers, you may want to try H.264 (MPEG-4 part 10) instead.

To do that, change:

fourcc = cv2.VideoWriter_fourcc(*'MP4V')


fourcc = cv2.VideoWriter_fourcc(*'H264')

If you are using Python 3, use the following hexadecimal code instead (there seems to be a bug when using the four bytes notation):

fourcc = 0x00000021

Run the script and you will likely get the following error message:

Failed to load OpenH264 library: openh264-1.6.0-win32msvc.dll Please check environment and/or download library:

You need to do as the message says and download the required library from github and place it somewhere accessible by your PATH.

Using H.264 compression you will also get a smaller file which is better for Web.

Monday, September 27, 2021
answered 2 Months ago
Only authorized users can answer the question. Please sign in first, or register a free account.
Not the answer you're looking for? Browse other questions tagged :