Cắt vùng quan tâm OpenCV Python

Trong video này, chúng ta sẽ thấy một chức năng quan trọng và cơ bản của OpenCV và chính xác Cách cắt ảnh bằng OpenCV và Python. Nó có vẻ là một điều tầm thường và bỏ qua đối với những người biết Opencv nhưng việc cắt xén hình ảnh bằng Python có thể giúp ích cho nhiều người mới bắt đầu theo dõi các bài học của tôi

Trong bài học này chúng ta sẽ thấy

1. Cách cắt ảnh theo chiều dọc hoặc chiều ngang
2. Cắt một phần của hình ảnh

1. Cách cắt ảnh theo chiều dọc hoặc chiều ngang

Đầu tiên chúng ta cần tải hình ảnh vào dự án của mình. Rõ ràng đối với các hình ảnh cắt bằng Opencv và Python, chúng tôi phải đảm bảo rằng thư viện OpenCV được cài đặt chính xác

Nếu bạn chưa cài đặt Opencv, đừng lo lắng, tôi cung cấp cho bạn hướng dẫn cài đặt trên ba thiết bị khác nhau

Cách cài đặt Python 3 và Opencv 4 trên Windows
Cài đặt Opencv 4. 1 trên Nvidia Jetson Nano
Hướng dẫn cài đặt Raspberry Pi 3 và Opencv 3

Chà, bây giờ chúng ta có tất cả các yếu tố cơ bản cần thiết, chúng ta tiến hành nhập Opencv và Numpy, sau đó chúng ta cũng đặt đường dẫn của hình ảnh để đưa nó vào dự án python của chúng ta

import cv2
import numpy as np

img = cv2.imread("colors.jpg")

Bây giờ chúng ta hãy lấy các hàng và cột của hình ảnh

rows, cols, _ = img.shape
print("Rows", rows)
print("Cols", cols)

Hàng đại diện cho phần dọc và cols phần ngang. Như đã thấy trong bản in của hình ảnh bên dưới, tôi đã khoanh tròn kết quả, kích thước hiển thị chính xác một hình chữ nhật

Cắt vùng quan tâm OpenCV Python

Bây giờ hãy tiến hành thử nghiệm cắt ngang đầu tiên

# Cut image
cut_image = img[426: 853, 0: 1280]

Trong mã, chúng tôi đã đặt một đường cắt ngang và trong hình ảnh, bạn có thể thấy kết quả thử nghiệm đầu tiên. Cố gắng thay đổi các số của mảng, trong giới hạn tối đa của hình ảnh, để hiểu rõ hơn về quy trình

Cắt vùng quan tâm OpenCV Python

2. Cắt một phần của hình ảnh

Sau tất cả các bước trước, để hiểu Cách cắt ảnh bằng OpenCV và Python, bây giờ chúng ta cần truy xuất vùng quan tâm (ROI). Nếu bạn muốn tìm hiểu thêm về chủ đề này, tôi khuyên dùng OpenCV chính thức

Để làm điều này, chúng ta cần tìm tọa độ của
-điểm trên cùng bên trái (x, y)
-phía dưới bên phải (x2, y2)
# ROI (Region of interest)
cv2.rectangle(img, (385, 155), (851, 613), (0, 255, 0), 3)

roi = img[155: 613, 385: 851]

Lần đầu tiên tôi kiểm tra tọa độ của các điểm để tôi có thể nhập chúng theo cách thủ công. Như bạn có thể thấy từ hình ảnh đây là kết quả cuối cùng

Cắt vùng quan tâm OpenCV Python

Bạn có thể nhận thấy rằng có một khung nhỏ màu xanh lá cây, không cần thiết phải có nó và bạn có thể xóa nó bằng cách bình luận chức năng này cv2. hình chữ nhật

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách chọn hộp giới hạn hoặc vùng quan tâm hình chữ nhật (ROI) trong ảnh trong OpenCV. Trước đây, chúng tôi phải viết bộ chọn hộp giới hạn của riêng mình bằng cách xử lý các sự kiện chuột. Tuy nhiên, bây giờ chúng tôi có tùy chọn sử dụng chức năng selectROI vốn là một phần của OpenCV

Tôi luôn ngạc nhiên trước những lựa chọn kỳ lạ được thực hiện trong thư viện OpenCV. Bạn sẽ nghĩ rằng selectROI sẽ là một phần của highgui có chức năng hiển thị hình ảnh, vẽ lên hình ảnh, v.v. Tuy nhiên, selectROI là một phần của API theo dõi. Như bạn sẽ nhận thấy ở phần sau của bài đăng, các lựa chọn được thực hiện khi viết selectROI là kỳ lạ. Nhưng, trước khi chúng ta chỉ trích, chúng ta phải biết ơn vì ai đó đã tạo ra thứ gì đó hữu ích mặc dù nó không hoàn hảo

Hãy đi sâu vào và xem cách sử dụng selectROI

Cách chọn khu vực quan tâm trong OpenCV

Vì selectROI là một phần của API theo dõi, bạn phải có OpenCV 3. 0 (hoặc cao hơn) được cài đặt với opencv_contrib

Hãy bắt đầu với một mã mẫu. Nó cho phép bạn chọn một hình chữ nhật trong ảnh, cắt vùng hình chữ nhật và cuối cùng hiển thị ảnh đã cắt

Chúng tôi sẽ sửa đổi dòng được đánh dấu để thử các tùy chọn khác nhau

C++

#include <opencv2/opencv.hpp>
// selectROI is part of tracking API
#include <opencv2/tracking.hpp>

using namespace std;
using namespace cv;

int main (int argc, char **arv)
{
    // Read image
    Mat im = imread("image.jpg");

    // Select ROI
    Rect2d r = selectROI(im);

    // Crop image
    Mat imCrop = im(r);

    // Display Cropped Image
    imshow("Image", imCrop);
    waitKey(0);

    return 0;
}

Mã tương tự có thể được viết bằng Python như

con trăn

import cv2
import numpy as np

if __name__ == '__main__' :

    # Read image
    im = cv2.imread("image.jpg")

    # Select ROI
    r = cv2.selectROI(im)

    # Crop image
    imCrop = im[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]

    # Display cropped image
    cv2.imshow("Image", imCrop)
    cv2.waitKey(0)

Kéo hình chữ nhật từ trên cùng bên trái xuống dưới cùng bên phải

Nếu bạn giống tôi, bạn sẽ muốn kéo một hình chữ nhật từ góc trên cùng bên trái xuống góc dưới cùng bên phải thay vì kéo nó từ giữa. Chúng ta có thể dễ dàng khắc phục điều đó bằng cách thay thế dòng được đánh dấu bằng dòng sau

C++

bool fromCenter = false;
Rect2d r = selectROI(im, fromCenter);

con trăn

fromCenter = False
r = cv2.selectROI(im, fromCenter)

Cách chỉ định tên cửa sổ?

Sẽ không hay sao nếu bạn có thể sử dụng một cửa sổ hiện có thay vì cửa sổ của bộ chọn ROI?

C++

________số 8_______

con trăn

fromCenter = False
r = cv2.selectROI("Image", im, fromCenter)

Tôi đã hợp tác độc quyền với OpenCV. org mang đến cho bạn các khóa học chính thức về Trí tuệ nhân tạo, Thị giác máy tính và Học sâu để đưa bạn vào lộ trình có cấu trúc từ những bước đầu tiên đến khi thành thạo

Tìm hiểu thêm

Bạn không muốn hiển thị crosshair?

Giả sử bạn không thích hình chữ thập và muốn xem hình chữ nhật mà không có nó. Bạn có thể sửa đổi mã để không hiển thị dấu thập

C++

bool showCrosshair = false;
bool fromCenter = false;
Rect2d r = selectROI("Image", im, fromCenter, showCrosshair);

con trăn

showCrosshair = False
fromCenter = False
r = cv2.selectROI("Image", im, fromCenter, showCrosshair)

Làm cách nào để chọn nhiều vùng quan tâm (ROI) của một hình ảnh?

Chức năng selectROI cũng cho phép bạn chọn nhiều vùng quan tâm nhưng có 2 lỗi