Hướng dẫn how do i create a multiple rectangle in opencv python? - làm cách nào để tạo nhiều hình chữ nhật trong opencv python?

Tôi đang cố gắng xác định vị trí các hình chữ nhật trong một hình ảnh và áp dụng một trình phân loại để nhận ra các số bên trong từng hình, sử dụng một trình phân loại được đào tạo trước đó:

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

features = x_train[:8000, :, :]
labels = y_train[:8000]
list_hog_fd = []

for feature in features:
    fd = hog(feature.reshape((28, 28)), orientations=9, pixels_per_cell=(14, 14), cells_per_block=(1, 1), visualise=False)
    list_hog_fd.append(fd)
hog_features = np.array(list_hog_fd, 'float64')


clf = LinearSVC()
clf.fit(hog_features, labels)

imPath = "/Users/alessandro/Downloads/prova prova(2).jpg"
im = cv2.imread(imPath)

# Convert to grayscale and apply Gaussian filtering
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gray = cv2.GaussianBlur(im_gray, (5, 5), 0)

# Threshold the image
ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)

# Find contours in the image
ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Get rectangles contains each contour
rects = [cv2.boundingRect(ctr) for ctr in ctrs]

Từ thời điểm này trở đi, nó hoạt động hoàn hảo, với hình ảnh của riêng tôi, nhưng bất cứ khi nào tôi bắt đầu vòng lặp For, nó sẽ tạo ra "ROI" S trống, trả lại lỗi "Lỗi: Lỗi:

OpenCV (4.0.0)/người sử dụng 'Thay đổi kích thước' "

Ở dòng "ROI = cv2.resize (ROI, (28, 28), nội suy = cv2.inter_area)".

# For each rectangular region, calculate HOG features and predict
# the digit using Linear SVM.
for rect in rects:

    # Draw the rectangles
    cv2.rectangle(im, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 255, 0), 3) 

    # Make the rectangular region around the digit
    leng = int(rect[3] * 1.6)
    pt1 = int(rect[1] + rect[3] // 2 - leng // 2)
    pt2 = int(rect[0] + rect[2] // 2 - leng // 2)
    roi = im_th[pt1:pt1+leng, pt2:pt2+leng]

    # Resize the image
    roi = cv2.resize(roi, (28, 28), interpolation=cv2.INTER_AREA)
    roi = cv2.dilate(roi, (3, 3))

    #Calculate the HOG features
    roi_hog_fd = hog(roi, orientations=9, pixels_per_cell=(14, 14), cells_per_block=(1, 1), visualise=False)
    nbr = clf.predict(np.array([roi_hog_fd], 'float64'))
    cv2.putText(im, str(int(nbr[0])), (rect[0], rect[1]),cv2.FONT_HERSHEY_DUPLEX, 2, (0, 255, 255), 3)

cv2.imshow("Resulting Image with Rectangular ROIs", im)
cv2.waitKey()

Làm thế nào tôi có thể sửa mã?

P.S. Để tham khảo, hãy kiểm tra http://hanzratech.in/2015/02/24/handwritten-digit-rec nhận ra

Giới thiệu

Trong bài đăng này, chúng tôi sẽ học cách vẽ hình chữ nhật trên một hình ảnh, sử dụng Python và OpenCV.

OpenCV cung cấp cho chúng tôi một vài chức năng để vẽ hình dạng trên hình ảnh, như có thể thấy ở đây. Đây có thể là thú vị để làm nổi bật các khu vực quan tâm. Ví dụ, nếu chúng ta đang áp dụng một thuật toán để phát hiện các khuôn mặt, một cách đơn giản để báo hiệu chúng có thể vẽ một hình chữ nhật xung quanh chúng.

Hướng dẫn này đã được thử nghiệm trên Windows 8.1, với phiên bản 4.1.2 của OpenCV. Phiên bản Python được sử dụng là 3,7.2.

Vẽ hình chữ nhật

Dòng đầu tiên của mã của chúng tôi sẽ là nhập mô -đun CV2, vì vậy chúng tôi có quyền truy cập vào chức năng mà chúng tôi cần vẽ hình chữ nhật trên hình ảnh.cv2 module, so we have access to the function we need to draw rectangles on images.

Tiếp theo, chúng tôi sẽ chăm sóc đọc một hình ảnh từ hệ thống tệp. Chúng tôi làm như vậy với một cuộc gọi đến chức năng iMread. Là đầu vào, chúng tôi chuyển đường dẫn đến hình ảnh và, dưới dạng đầu ra, hàm trả về hình ảnh dưới dạng ndarray. Khi kiểm tra mã, đừng quên cập nhật đường dẫn lên hình ảnh trong hệ thống tệp của bạn.

img = cv2.imread('C:/Users/N/Desktop/monument.png')

Bây giờ chúng ta có hình ảnh của chúng ta trong bộ nhớ, chúng ta sẽ vẽ một số hình chữ nhật trên đó. Để vẽ một hình chữ nhật với OpenCV, chúng ta chỉ cần sử dụng hàm hình chữ nhật. Hàm này nhận được các đối số sau:

  • Hình ảnh nơi vẽ hình chữ nhật. Chúng tôi sẽ vượt qua hình ảnh chúng tôi vừa đọc;
  • Một tuple với tọa độ X và Y của một trong các đỉnh của hình chữ nhật. Để đơn giản hóa bản vẽ của hình dạng, việc luôn luôn nghĩ về đỉnh này là góc trên cùng bên trái của hình chữ nhật;
  • Một tuple với tọa độ X và Y của đỉnh đối diện của hình chữ nhật, liên quan đến hình chữ nhật trước. Ngoài ra để đơn giản hóa, chúng ta có thể xem xét đây là góc dưới bên phải của hình chữ nhật;
  • Một tuple với màu BGR của hình chữ nhật;
  • Độ dày của các đường của hình chữ nhật. Đó là một tham số tùy chọn, khi không được chỉ định, mặc định là 1. Ngoài ra, các số âm sẽ dẫn đến một hình chữ nhật đầy được vẽ.

Điều quan trọng là phải xem xét rằng hàm hình chữ nhật làm thay đổi hình ảnh chúng ta truyền dưới dạng đầu vào. Điều này có nghĩa là, nếu chúng ta muốn giữ hình ảnh gốc không thay đổi, chúng ta nên thực hiện một bản sao của nó và vẽ hình chữ nhật trên bản sao đó. Để tìm hiểu cách thực hiện một bản sao của một hình ảnh trong bộ nhớ với OpenCV, vui lòng tham khảo bài đăng này.rectangle function alters the image we pass as input. This means that, if we want to keep the original image unaltered, we should do a copy of it and draw the rectangle on that copy. To learn how to perform a copy of an image in memory with OpenCV, please consult this post.

Bây giờ chúng tôi đã phân tích tất cả các đối số của hàm hình chữ nhật của mô -đun CV2, chúng tôi sẽ vẽ hình dạng đầu tiên. Chúng ta sẽ vẽ nó giữa (x = 10, y = 10) và (x = 100, y = 100), màu xanh lá cây. Ngoài ra, để minh họa rằng độ dày là tùy chọn, chúng tôi đã giành được giá trị này.rectangle function of the cv2 module, we will draw the first shape. We will draw it between (x=10, y=10) and (x=100, y=100), in green color. Also, to illustrate that the thickness is optional, we won’t set this value.

cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0))

Chúng ta sẽ vẽ một hình chữ nhật thứ hai, lần này là giữa (x = 120, y = 120) và (x = 150, y = 150). Màu sắc sẽ có màu xanh lần này và chúng tôi sẽ đặt độ dày của các đường của hình chữ nhật thành 5 pixel.

cv2.rectangle(img, (120, 120), (150, 150), (255, 0, 0), 5)

Hình chữ nhật cuối cùng của chúng tôi sẽ nằm giữa các tọa độ (x = 200, y = 200) và (x = 300, y = 400) và được vẽ màu đỏ. Chúng tôi cũng sẽ đặt độ dày thành một số âm, vì vậy nó được vẽ dưới dạng hình dạng đầy.

cv2.rectangle(img, (200, 200), (300, 400), (0, 0, 255), -1)

Quan trọng: Các tọa độ mà tôi đã sử dụng để vẽ ba hình chữ nhật trước đó là đủ cho kích thước của hình ảnh tôi sử dụng. Tùy thuộc vào hình ảnh bạn sẽ sử dụng cho các bài kiểm tra của mình, bạn có thể cần sử dụng các tọa độ khác nhau cho các hình chữ nhật để phù hợp với bên trong.: The coordinates I’ve used to draw the previous three rectangles are adequate for the size of the image I’m using. Depending on the image you will be using for your tests, you may need to use different coordinates for the rectangles to fit inside.

Bây giờ chúng tôi đã vẽ xong hình ảnh của mình, chúng tôi sẽ hiển thị nó trong một cửa sổ OpenCV. Điều này được thực hiện với một cuộc gọi đến chức năng Imshow, chuyển sang đầu tiên nhập tên của cửa sổ và là hình ảnh thứ hai của chúng tôi.imshow function, passing as first input the name of the window and as second our image.

Để hoàn thiện, chúng tôi sẽ đợi người dùng nhấn bất kỳ phím nào trên bàn phím và, khi điều đó xảy ra, phá hủy cửa sổ và kết thúc chương trình.

cv2.waitKey(0)
cv2.destroyAllWindows()

Mã Python hoàn chỉnh có thể được nhìn thấy dưới đây.

import cv2
 
img = cv2.imread('C:/Users/N/Desktop/monument.png')

cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0))
cv2.rectangle(img, (120, 120), (150, 150), (255, 0, 0), 5)
cv2.rectangle(img, (200, 200), (300, 400), (0, 0, 255), -1)


cv2.imshow('image', img)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

Kiểm tra mã

Để kiểm tra tập lệnh Python trước đó, chỉ cần chạy nó trong một công cụ bạn chọn. Tôi sẽ sử dụng pycharm, một ide python.

Khi chạy mã, bạn sẽ nhận được kết quả tương tự như bản được minh họa trong Hình 1. Như có thể thấy, chúng tôi có ba hình chữ nhật trong hình ảnh. Cái đầu tiên được vẽ bằng màu xanh lá cây, với chiều rộng 1 pixel. Cái thứ hai được vẽ màu xanh lam và với các đường dày hơn. Cái thứ ba được vẽ màu đỏ và nó là một hình chữ nhật đầy. Ba được rút ra giữa các tọa độ mà chúng tôi đã chỉ định trong mã của chúng tôi, như mong đợi.

Hướng dẫn how do i create a multiple rectangle in opencv python? - làm cách nào để tạo nhiều hình chữ nhật trong opencv python?
Hình 1 - Hình ảnh cuối cùng, với ba hình chữ nhật được vẽ. – Final image, with the three rectangles drawn.

Bài đọc OpenCV đề xuất

  • Cách vẽ vòng tròn
  • Cách vẽ văn bản trên hình ảnh
  • Phát hiện và đếm mặt

Làm thế nào để bạn vẽ một hình chữ nhật trong OpenCV Python?

Hình chữ nhật trong OpenCV Python: CV2 ...
Hình ảnh - đó là hình ảnh mà hình chữ nhật phải được vẽ ..
PT1 - đỉnh của hình chữ nhật ở góc trên cùng bên trái ..
PT2 - đỉnh của hình chữ nhật ở góc dưới bên phải ..
Màu sắc - Đó là màu của đường hình chữ nhật trong RGB ..
Độ dày - đó là độ dày của đường dây ..

Làm thế nào để bạn vẽ nhiều hình chữ nhật trong pygame?

Sử dụng một nhóm sẽ cho phép bạn vẽ tất cả các hình chữ nhật cùng một lúc.Bạn có thể thay đổi hình chữ nhật bằng hàm Change_Value.Làm thế nào tôi có thể thay đổi vị trí của từng cá nhân?Tôi muốn chúng được liên kết trong một hàng lần lượt.. You can change the rectangles using the change_value function. How would I go about changing the position of each individual sprite? I want them aligned in a row one after another.

Làm thế nào để bạn vẽ hình dạng trong opencv?

Một số chức năng vẽ là:..
line (): Được sử dụng để vẽ dòng trên một hình ảnh ..
Hình chữ nhật (): Được sử dụng để vẽ hình chữ nhật trên hình ảnh ..
Circle (): Được sử dụng để vẽ vòng tròn trên một hình ảnh ..
puttext (): Được sử dụng để viết văn bản trên hình ảnh ..

Làm cách nào để vẽ một hình chữ nhật trong một hình ảnh bằng Python?

Python - OpenCV & PyQT5 cùng nhau trong chương trình này, chúng ta sẽ vẽ một hình chữ nhật bằng hình chữ nhật hàm openCV ().Hàm này có một số tham số như tọa độ bắt đầu, kết thúc tọa độ, màu sắc và độ dày và chính hình ảnh.using the OpenCV function rectangle(). This function takes some parameters like starting coordinates, ending coordinates, color and thickness and the image itself.