Tải xuống nhiều hình ảnh python

Cuối tuần vừa qua tôi đã bị cúm nặng. Tôi chưa làm được gì nhiều ngoài việc nằm dài trên ghế dài, nhâm nhi món phở gà từ cốc cà phê và chơi game Call of Duty liên tục

Thành thật mà nói, đã nhiều năm kể từ khi tôi dành một ngày cuối tuần không ngừng nghỉ để chơi Call of Duty. Lên mạng và chơi các vòng Team Deathmatch và Domination bất tận đã mang lại một số kỷ niệm tuyệt vời về người bạn cùng phòng thời đại học của tôi và bản thân tôi đã chơi game thâu đêm suốt những năm đại học

Nghiêm túc mà nói, khi còn học đại học, tôi là một tín đồ cuồng nhiệt của Call of Duty - Tôi thậm chí còn treo những tấm áp phích Call of Duty trên tường. Và tôi đã chơi tất cả các trò chơi. các trò chơi Call of Duty ban đầu lấy bối cảnh trong Thế chiến thứ hai; . Và trong khi tôi quá ốm để có thể rời khỏi đi văng vào cuối tuần này, tôi không thể vượt qua trò chơi Thống trị mà không gặp vấn đề gì

Nhưng đến cuối chiều chủ nhật, tôi bắt đầu cảm thấy hơi kiệt sức khi chơi game. Rõ ràng, chỉ có một lượng trò chơi hữu hạn mà tôi có thể chơi trong một lần ngồi khi tôi không còn học đại học nữa

Dù sao đi nữa, tôi với lấy chiếc máy tính xách tay của mình và bắt đầu lướt web. Sau một vài phút duyệt Facebook, tôi bắt gặp một hướng dẫn khớp mẫu mà tôi đã thực hiện tại Machine Learning Mastery. Trong bài viết này, tôi đã hướng dẫn chi tiết cách chơi trò chơi Where's Waldo?

Mặc dù hướng dẫn này khá thú vị [mặc dù, rất mang tính giới thiệu], nhưng tôi nhận ra rằng có một tiện ích mở rộng dễ dàng giúp khớp mẫu mạnh mẽ hơn cần được đề cập

Bạn thấy đấy, có những lúc sử dụng trình phát hiện điểm chính, bộ mô tả bất biến cục bộ [chẳng hạn như SIFT, SURF, FREAK, v.v. ] và đối sánh điểm chính với RANSAC hoặc LMED đơn giản là quá mức cần thiết — và bạn nên sử dụng phương pháp đơn giản hơn

Trong bài đăng trên blog này, tôi sẽ trình bày chi tiết cách bạn có thể mở rộng đối sánh mẫu thành nhiều tỷ lệ và hoạt động với các hình ảnh trong đó mẫu và hình ảnh đầu vào không cùng kích thước

Tìm kiếm mã nguồn cho bài viết này?

Phiên bản OpenCV và Python
Ví dụ này sẽ chạy trên Python 2. 7/Trăn 3. 4+ và OpenCV 2. 4. X

Khớp mẫu nhiều tỷ lệ bằng Python và OpenCV

Để bắt đầu hướng dẫn này, trước tiên hãy hiểu lý do tại sao cách tiếp cận tiêu chuẩn để đối sánh mẫu bằng cách sử dụng cv2.matchTemplate không hiệu quả lắm

Hãy xem hình ảnh ví dụ bên dưới

Hình 1. Khớp mẫu không hoạt động khi kích thước của hình ảnh mẫu [trái] không khớp với kích thước của vùng trong ảnh [phải]

Trong hình ảnh ví dụ trên, chúng ta có logo Call of Duty ở bên trái. Và ở bên phải, chúng tôi có hình ảnh mà chúng tôi muốn phát hiện logo Call of Duty trong

Ghi chú. Cả mẫu và hình ảnh đầu vào đều khớp trên các biểu diễn bản đồ cạnh. Hình ảnh bên phải chỉ đơn giản là đầu ra của hoạt động sau khi cố gắng tìm mẫu bằng cách sử dụng bản đồ cạnh của cả hai hình ảnh

Tuy nhiên, khi chúng tôi cố gắng áp dụng khớp mẫu bằng cách sử dụng chức năng cv2.matchTemplate, chúng tôi bị khớp sai — điều này là do kích thước của hình ảnh logo ở bên trái nhỏ hơn đáng kể so với logo Call of Duty trên bìa trò chơi ở bên phải

Cho rằng kích thước của mẫu Call of Duty không khớp với kích thước của logo Call of Duty trên bìa trò chơi, chúng tôi bị phát hiện sai

Vậy chúng ta làm gì bây giờ?

Bỏ cuộc?

Không quá nhanh

Mặc dù việc phát hiện các điểm chính, trích xuất các bộ mô tả bất biến cục bộ và các điểm chính phù hợp chắc chắn sẽ hoạt động, nhưng nó hoàn toàn quá mức cần thiết cho vấn đề này

Trên thực tế, chúng ta có thể sử dụng một giải pháp dễ dàng hơn nhiều — và với ít mã hơn đáng kể

cv2. trận đấuMẫu thủ thuật

Vì vậy, như tôi đã gợi ý ở đầu bài đăng này, chỉ vì kích thước của mẫu của bạn không khớp với kích thước của vùng trong hình ảnh bạn muốn khớp, không có nghĩa là bạn không thể áp dụng khớp mẫu

Trong trường hợp này, tất cả những gì bạn cần làm là áp dụng một mẹo nhỏ

  1. Lặp lại hình ảnh đầu vào ở nhiều tỷ lệ [i. e. làm cho hình ảnh đầu vào nhỏ dần và nhỏ hơn]
  2. Áp dụng đối sánh mẫu bằng cách sử dụng cv2.matchTemplate và theo dõi đối sánh có hệ số tương quan lớn nhất [cùng với tọa độ x, y của vùng có hệ số tương quan lớn nhất]
  3. Sau khi lặp qua tất cả các tỷ lệ, hãy lấy vùng có hệ số tương quan lớn nhất và sử dụng vùng đó làm vùng “phù hợp” của bạn

Như tôi đã nói, thủ thuật này rất đơn giản — nhưng trong một số trường hợp, cách tiếp cận này có thể giúp bạn không phải viết thêm nhiều mã và xử lý các kỹ thuật lạ mắt hơn để khớp các đối tượng trong hình ảnh

Ghi chú. Theo định nghĩa, khớp mẫu là bất biến dịch thuật. Tiện ích mở rộng mà chúng tôi đang đề xuất hiện có thể giúp làm cho nó mạnh mẽ hơn trước những thay đổi về tỷ lệ [i. e. kích cỡ]. Nhưng so khớp mẫu không lý tưởng nếu bạn đang cố khớp các đối tượng được xoay hoặc các đối tượng thể hiện các phép biến đổi không liên quan. Nếu bạn quan tâm đến các loại biến đổi này, tốt hơn hết là bạn nên chuyển ngay sang khớp điểm chính

Dù sao, đủ với nói chuyện. Hãy nhảy vào một số mã. Mở trình soạn thảo yêu thích của bạn, tạo một tệp mới, đặt tên là match.py và bắt đầu

# import the necessary packages
import numpy as np
import argparse
import imutils
import glob
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser[]
ap.add_argument["-t", "--template", required=True, help="Path to template image"]
ap.add_argument["-i", "--images", required=True,
	help="Path to images where template will be matched"]
ap.add_argument["-v", "--visualize",
	help="Flag indicating whether or not to visualize each iteration"]
args = vars[ap.parse_args[]]

# load the image image, convert it to grayscale, and detect edges
template = cv2.imread[args["template"]]
template = cv2.cvtColor[template, cv2.COLOR_BGR2GRAY]
template = cv2.Canny[template, 50, 200]
[tH, tW] = template.shape[:2]
cv2.imshow["Template", template]

Điều đầu tiên chúng tôi sẽ làm là nhập các gói chúng tôi cần. Chúng tôi sẽ sử dụng NumPy để xử lý số, argparse để phân tích đối số dòng lệnh,

# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
0 cho một số chức năng tiện lợi xử lý hình ảnh [đi kèm với. zip của mã cho bài đăng này],
# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
1 để lấy đường dẫn đến hình ảnh đầu vào của chúng tôi và
# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
2 cho các liên kết OpenCV của chúng tôi

Sau đó, chúng tôi phân tích các lập luận của mình trên Dòng 8-15. Chúng ta sẽ cần ba công tắc.

# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
3 , là đường dẫn đến mẫu mà chúng tôi muốn khớp trong hình ảnh của mình [i. e. logo Call of Duty],
# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
4 , đường dẫn đến thư mục bao gồm các hình ảnh chứa logo Call of Duty mà chúng tôi muốn tìm và một đối số
# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
5 tùy chọn cho phép chúng tôi hình dung tìm kiếm phù hợp với mẫu trên nhiều tỷ lệ

Tiếp theo, đã đến lúc tải mẫu của chúng tôi ra khỏi đĩa trên Dòng 18. Chúng tôi cũng sẽ chuyển đổi nó thành thang độ xám trên Dòng 19 và phát hiện các cạnh trên Dòng 20. Như bạn sẽ thấy ở phần sau của bài đăng này, việc áp dụng khớp mẫu bằng cách sử dụng các cạnh thay vì hình ảnh thô giúp chúng tôi tăng đáng kể độ chính xác cho khớp mẫu

Lý do cho điều này là vì logo Call of Duty cứng nhắc và được xác định rõ ràng — và như chúng ta sẽ thấy sau trong bài đăng này, nó cho phép chúng tôi loại bỏ màu sắc và kiểu dáng của logo và thay vào đó chỉ tập trung vào đường viền. Làm điều này mang lại cho chúng tôi một cách tiếp cận mạnh mẽ hơn một chút mà chúng tôi sẽ không có nếu không

Dù sao, sau khi áp dụng tính năng phát hiện cạnh, mẫu của chúng ta sẽ trông như thế này

Hình 2. Trích xuất các cạnh từ hình ảnh mẫu

Bây giờ, hãy làm việc với thủ thuật đa quy mô

# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break

Chúng tôi bắt đầu lặp lại các hình ảnh đầu vào của mình trên Dòng 25. Sau đó, chúng tôi tải hình ảnh ra khỏi đĩa, chuyển đổi nó thành thang độ xám và khởi tạo một biến sổ sách kế toán

# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
6 để theo dõi khu vực và tỷ lệ của hình ảnh phù hợp nhất

Từ đó, chúng tôi bắt đầu lặp qua nhiều tỷ lệ của hình ảnh trên Dòng 33 bằng cách sử dụng hàm

# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
7. Hàm này chấp nhận ba đối số, giá trị bắt đầu, giá trị kết thúc và số lượng các lát cắt bằng nhau ở giữa. Trong ví dụ này, chúng tôi sẽ bắt đầu từ 100% kích thước ban đầu của hình ảnh và giảm xuống 20% ​​kích thước ban đầu thành 20 phần trăm có kích thước bằng nhau

Sau đó, chúng tôi thay đổi kích thước hình ảnh hình ảnh theo

# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
8 hiện tại trên Dòng 36 và tính tỷ lệ giữa chiều rộng cũ với chiều rộng mới — như bạn sẽ thấy sau này, điều quan trọng là chúng tôi phải theo dõi tỷ lệ này

Trên Dòng 41, chúng tôi kiểm tra để đảm bảo rằng hình ảnh đầu vào lớn hơn mẫu phù hợp với chúng tôi. Nếu mẫu lớn hơn, thì cuộc gọi cv2.matchTemplate của chúng tôi sẽ đưa ra lỗi, vì vậy chúng tôi chỉ thoát khỏi vòng lặp nếu trường hợp này xảy ra

Tại thời điểm này, chúng tôi có thể áp dụng khớp mẫu cho hình ảnh đã thay đổi kích thước của mình

		# detect edges in the resized, grayscale image and apply template
		# matching to find the template in the image
		edged = cv2.Canny[resized, 50, 200]
		result = cv2.matchTemplate[edged, template, cv2.TM_CCOEFF]
		[_, maxVal, _, maxLoc] = cv2.minMaxLoc[result]

		# check to see if the iteration should be visualized
		if args.get["visualize", False]:
			# draw a bounding box around the detected region
			clone = np.dstack[[edged, edged, edged]]
			cv2.rectangle[clone, [maxLoc[0], maxLoc[1]],
				[maxLoc[0] + tW, maxLoc[1] + tH], [0, 0, 255], 2]
			cv2.imshow["Visualize", clone]
			cv2.waitKey[0]

		# if we have found a new maximum correlation value, then update
		# the bookkeeping variable
		if found is None or maxVal > found[0]:
			found = [maxVal, maxLoc, r]

	# unpack the bookkeeping variable and compute the [x, y] coordinates
	# of the bounding box based on the resized ratio
	[_, maxLoc, r] = found
	[startX, startY] = [int[maxLoc[0] * r], int[maxLoc[1] * r]]
	[endX, endY] = [int[[maxLoc[0] + tW] * r], int[[maxLoc[1] + tH] * r]]

	# draw a bounding box around the detected result and display the image
	cv2.rectangle[image, [startX, startY], [endX, endY], [0, 0, 255], 2]
	cv2.imshow["Image", image]
	cv2.waitKey[0]

Trên Dòng 46, chúng tôi tính toán biểu diễn cạnh Canny của hình ảnh, sử dụng các tham số chính xác giống như trong hình ảnh mẫu

Sau đó, chúng tôi áp dụng khớp mẫu bằng cách sử dụng cv2.matchTemplate trên Dòng 47. Hàm cv2.matchTemplate nhận ba đối số. hình ảnh đầu vào, mẫu chúng tôi muốn tìm trong hình ảnh đầu vào và phương pháp đối sánh mẫu. Trong trường hợp này, chúng tôi cung cấp cờ

		# detect edges in the resized, grayscale image and apply template
		# matching to find the template in the image
		edged = cv2.Canny[resized, 50, 200]
		result = cv2.matchTemplate[edged, template, cv2.TM_CCOEFF]
		[_, maxVal, _, maxLoc] = cv2.minMaxLoc[result]

		# check to see if the iteration should be visualized
		if args.get["visualize", False]:
			# draw a bounding box around the detected region
			clone = np.dstack[[edged, edged, edged]]
			cv2.rectangle[clone, [maxLoc[0], maxLoc[1]],
				[maxLoc[0] + tW, maxLoc[1] + tH], [0, 0, 255], 2]
			cv2.imshow["Visualize", clone]
			cv2.waitKey[0]

		# if we have found a new maximum correlation value, then update
		# the bookkeeping variable
		if found is None or maxVal > found[0]:
			found = [maxVal, maxLoc, r]

	# unpack the bookkeeping variable and compute the [x, y] coordinates
	# of the bounding box based on the resized ratio
	[_, maxLoc, r] = found
	[startX, startY] = [int[maxLoc[0] * r], int[maxLoc[1] * r]]
	[endX, endY] = [int[[maxLoc[0] + tW] * r], int[[maxLoc[1] + tH] * r]]

	# draw a bounding box around the detected result and display the image
	cv2.rectangle[image, [startX, startY], [endX, endY], [0, 0, 255], 2]
	cv2.imshow["Image", image]
	cv2.waitKey[0]
2, cho biết chúng tôi đang sử dụng hệ số tương quan để khớp các mẫu

Hàm

		# detect edges in the resized, grayscale image and apply template
		# matching to find the template in the image
		edged = cv2.Canny[resized, 50, 200]
		result = cv2.matchTemplate[edged, template, cv2.TM_CCOEFF]
		[_, maxVal, _, maxLoc] = cv2.minMaxLoc[result]

		# check to see if the iteration should be visualized
		if args.get["visualize", False]:
			# draw a bounding box around the detected region
			clone = np.dstack[[edged, edged, edged]]
			cv2.rectangle[clone, [maxLoc[0], maxLoc[1]],
				[maxLoc[0] + tW, maxLoc[1] + tH], [0, 0, 255], 2]
			cv2.imshow["Visualize", clone]
			cv2.waitKey[0]

		# if we have found a new maximum correlation value, then update
		# the bookkeeping variable
		if found is None or maxVal > found[0]:
			found = [maxVal, maxLoc, r]

	# unpack the bookkeeping variable and compute the [x, y] coordinates
	# of the bounding box based on the resized ratio
	[_, maxLoc, r] = found
	[startX, startY] = [int[maxLoc[0] * r], int[maxLoc[1] * r]]
	[endX, endY] = [int[[maxLoc[0] + tW] * r], int[[maxLoc[1] + tH] * r]]

	# draw a bounding box around the detected result and display the image
	cv2.rectangle[image, [startX, startY], [endX, endY], [0, 0, 255], 2]
	cv2.imshow["Image", image]
	cv2.waitKey[0]
3 trên Dòng 48 lấy kết quả tương quan của chúng ta và trả về một bộ 4 bao gồm giá trị tương quan nhỏ nhất, giá trị tương quan lớn nhất, tọa độ [x, y] của giá trị nhỏ nhất và tọa độ [x, y] . Chúng tôi chỉ quan tâm đến giá trị lớn nhất và tọa độ [x, y] vì vậy chúng tôi giữ giá trị lớn nhất và loại bỏ giá trị nhỏ nhất

Xử lý dòng 51-57 trực quan hóa khớp mẫu đa tỷ lệ. Điều này cho phép chúng tôi kiểm tra các vùng của hình ảnh được khớp ở mỗi lần lặp lại tỷ lệ

Từ đó, chúng tôi cập nhật biến sổ sách kế toán của mình

# loop over the images to find the template in
for imagePath in glob.glob[args["images"] + "/*.jpg"]:
	# load the image, convert it to grayscale, and initialize the
	# bookkeeping variable to keep track of the matched region
	image = cv2.imread[imagePath]
	gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]
	found = None

	# loop over the scales of the image
	for scale in np.linspace[0.2, 1.0, 20][::-1]:
		# resize the image according to the scale, and keep track
		# of the ratio of the resizing
		resized = imutils.resize[gray, width = int[gray.shape[1] * scale]]
		r = gray.shape[1] / float[resized.shape[1]]

		# if the resized image is smaller than the template, then break
		# from the loop
		if resized.shape[0] < tH or resized.shape[1] < tW:
			break
6 trên Dòng 61 và 62 để theo dõi giá trị tương quan tối đa được tìm thấy cho đến nay, tọa độ [x, y] của giá trị tối đa, cùng với tỷ lệ giữa chiều rộng hình ảnh ban đầu và

Tại thời điểm này, tất cả các công việc khó khăn đã được thực hiện

Sau khi chúng tôi đã lặp qua tất cả các tỷ lệ của hình ảnh, chúng tôi giải nén biến kế toán của mình trên Dòng 66, sau đó tính toán tọa độ bắt đầu và kết thúc [x, y] của hộp giới hạn của chúng tôi trên Dòng 67 và 68. Đặc biệt cẩn thận để nhân tọa độ của hộp giới hạn với tỷ lệ trên Dòng 37 để đảm bảo rằng tọa độ khớp với kích thước ban đầu của hình ảnh đầu vào

Cuối cùng, chúng tôi vẽ hộp giới hạn của mình và hiển thị nó trên màn hình của chúng tôi trên Dòng 71-73

Kết quả đối sánh mẫu nhiều tỷ lệ

Đừng hiểu ý tôi rằng phương pháp này hiệu quả. Hãy xem xét một số ví dụ

Mở terminal của bạn và thực hiện lệnh sau

$ python match.py --template cod_logo.png --images images

Kết quả của bạn sẽ trông như thế này

Hình 3. Áp dụng thành công đối sánh mẫu đa tỷ lệ để tìm mẫu trong ảnh

Như bạn có thể thấy, phương pháp của chúng tôi đã tìm thành công logo Call of Duty, không giống như mẫu cơ bản phù hợp trong Hình 1 không tìm thấy logo

hinh 4. Một đối sánh thành công khác bằng cách sử dụng đối sánh mẫu nhiều tỷ lệ. Lưu ý các logo khác với hình ảnh này và Hình 3 như thế nào

Sau đó, chúng tôi áp dụng khớp mẫu đa tỷ lệ cho một bìa trò chơi Call of Duty khác — và một lần nữa chúng tôi đã tìm thấy logo Call of Duty, mặc dù mẫu này nhỏ hơn đáng kể so với hình ảnh đầu vào

Ngoài ra, hãy dành một chút thời gian để xem phong cách và màu sắc của logo Call of Duty khác nhau như thế nào trong Hình 3 và Hình 4. Nếu chúng tôi sử dụng mẫu RGB hoặc thang độ xám, chúng tôi sẽ không thể tìm thấy những logo này trong hình ảnh đầu vào. Nhưng bằng cách áp dụng khớp mẫu cho biểu diễn bản đồ cạnh thay vì biểu diễn RGB hoặc thang độ xám ban đầu, chúng tôi có thể thu được kết quả mạnh mẽ hơn một chút

Hãy thử một hình ảnh khác

Hình 5. Một lần nữa, so khớp mẫu đa tỷ lệ có thể tìm thấy logo [trái] trong hình ảnh đầu vào [phải]

Một lần nữa, phương pháp của chúng tôi đã có thể tìm thấy logo trong hình ảnh đầu vào

Điều này cũng đúng với Hình 6 bên dưới

Hình 6. Mẫu đa tỷ lệ phù hợp hơn với OpenCV và Python. Lưu ý cách "4" trong "Call of Duty 4" không được đưa vào trận đấu

Và bây giờ là Call of Duty yêu thích của tôi, Modern Warfare 3

Hình 7. Kết hợp mẫu nhiều tỷ lệ bằng cách sử dụng cv2. trận đấuMẫu

Một lần nữa, cách tiếp cận đa quy mô của chúng tôi đã có thể tìm thành công mẫu trong hình ảnh đầu vào

Và điều ấn tượng hơn nữa là có một lượng nhiễu rất lớn trong ảnh bìa trò chơi MW3 ở trên — các nghệ sĩ của ảnh bìa đã sử dụng khoảng trắng để tạo thành góc trên bên phải của chữ “Y” và góc dưới bên trái của chữ “Y”. . Tuy nhiên, phương pháp của chúng tôi có thể tìm thấy logo trong hình ảnh

Trực quan hóa trận đấu

Trong phần trên, chúng tôi đã xem xét đầu ra của trận đấu. Nhưng hãy dành một chút thời gian để đi sâu vào hình dung về cách thuật toán này thực sự hoạt động

Mở terminal của bạn và thực hiện lệnh sau

$ python match.py --template cod_logo.png --images images --visualize 1

Bạn sẽ thấy một hình ảnh động tương tự như sau

Hình 8. Hình ảnh động về cách hoạt động của tính năng so khớp mẫu nhiều tỷ lệ

Tại mỗi lần lặp lại, hình ảnh của chúng tôi được thay đổi kích thước và bản đồ cạnh Canny được tính toán

Sau đó, chúng tôi áp dụng đối sánh mẫu và tìm tọa độ [x, y] của hình ảnh có hệ số tương quan lớn nhất

Cuối cùng, chúng tôi lưu trữ các giá trị này trong một biến kế toán

Khi kết thúc thuật toán, chúng tôi tìm tọa độ [x, y] của vùng có đáp ứng hệ số tương quan lớn nhất trên tất cả các thang đo và sau đó vẽ hộp giới hạn của chúng tôi, như hình bên dưới

Hình 9. Đầu ra của mẫu đa tỷ lệ của chúng tôi phù hợp

Để hoàn thiện, đây là một ví dụ khác về trực quan hóa khớp mẫu đa tỷ lệ của chúng tôi bằng OpenCV và Python

Hình 10. Ví dụ thứ hai về trực quan hóa khớp mẫu đa tỷ lệ. Hạn chế và nhược điểm

Tất nhiên, áp dụng đối sánh mẫu đơn giản, thậm chí đối sánh mẫu đa tỷ lệ cũng có một số hạn chế và nhược điểm đáng kể

Mặc dù chúng tôi có thể xử lý các biến thể trong bản dịch và chia tỷ lệ, nhưng cách tiếp cận của chúng tôi sẽ không mạnh mẽ đối với những thay đổi trong phép biến đổi xoay hoặc không ảnh hưởng

Nếu chúng tôi lo lắng về việc xoay vòng trên các phép biến đổi không phải là affine, tốt hơn hết là chúng tôi nên dành thời gian để phát hiện các điểm chính, trích xuất các bộ mô tả bất biến cục bộ và áp dụng đối sánh điểm chính

Nhưng trong trường hợp các mẫu của chúng tôi [1] khá cứng nhắc và được xác định rõ thông qua bản đồ cạnh và [2] chúng tôi chỉ quan tâm đến việc dịch và chia tỷ lệ, thì việc so khớp mẫu nhiều tỷ lệ có thể mang lại cho chúng tôi kết quả rất tốt mà không tốn nhiều công sức

Cuối cùng, điều quan trọng cần lưu ý là tính năng so khớp mẫu không thực hiện tốt việc cho chúng tôi biết nếu một đối tượng không xuất hiện trong ảnh. Chắc chắn, chúng ta có thể đặt ngưỡng cho hệ số tương quan, nhưng trên thực tế, điều này không đáng tin cậy và mạnh mẽ. Nếu bạn đang tìm kiếm một cách tiếp cận mạnh mẽ hơn, bạn sẽ phải khám phá đối sánh điểm chính

Cái gì tiếp theo?

Thông tin khóa học
tổng số 69 lớp • 73 giờ video hướng dẫn mã theo yêu cầu • Cập nhật lần cuối. tháng 2 năm 2023
★★★★★ 4. 84 [128 Xếp hạng] • Hơn 15.800 Học sinh Ghi danh

Tôi thực sự tin rằng nếu bạn có đúng giáo viên, bạn có thể thành thạo thị giác máy tính và học sâu

Bạn có nghĩ rằng việc học thị giác máy tính và học sâu tốn nhiều thời gian, quá sức và phức tạp không?

Đó không phải là trường hợp

Tất cả những gì bạn cần để thành thạo thị giác máy tính và học sâu là nhờ ai đó giải thích mọi thứ cho bạn bằng các thuật ngữ đơn giản, trực quan. Và đó chính xác là những gì tôi làm. Nhiệm vụ của tôi là thay đổi giáo dục và cách dạy các chủ đề Trí tuệ nhân tạo phức tạp

Nếu bạn nghiêm túc về việc học thị giác máy tính, điểm dừng chân tiếp theo của bạn phải là Đại học PyImageSearch, khóa học trực tuyến về thị giác máy tính, học sâu và OpenCV toàn diện nhất hiện nay. Tại đây, bạn sẽ học cách áp dụng thành công và tự tin tầm nhìn máy tính vào công việc, nghiên cứu và dự án của mình. Tham gia cùng tôi trong việc làm chủ thị giác máy tính

Bên trong Đại học PyImageSearch, bạn sẽ tìm thấy

  • ✓ 69 khóa học về các chủ đề thiết yếu về thị giác máy tính, học sâu và OpenCV
  • ✓ 69 Chứng nhận hoàn thành khóa học
  • ✓ 73 giờ video theo yêu cầu
  • ✓ Các khóa học hoàn toàn mới được phát hành thường xuyên, đảm bảo bạn có thể theo kịp các kỹ thuật tiên tiến nhất
  • ✓ Máy tính xách tay Jupyter được định cấu hình sẵn trong Google Colab
  • ✓ Chạy tất cả các mẫu mã trong trình duyệt web của bạn — hoạt động trên Windows, macOS và Linux [không yêu cầu cấu hình môi trường nhà phát triển. ]
  • ✓ Truy cập kho lưu trữ mã tập trung cho tất cả hơn 500 hướng dẫn trên PyImageSearch
  • ✓ Dễ dàng tải xuống bằng một cú nhấp chuột đối với mã, bộ dữ liệu, mô hình được đào tạo trước, v.v.
  • ✓ Truy cập trên thiết bị di động, máy tính xách tay, máy tính để bàn, v.v.

Nhấn vào đây để tham gia Đại học PyImageSearch

Bản tóm tắt

Trong bài đăng trên blog này, chúng tôi đã khám phá ra cách làm cho mẫu khớp tiêu chuẩn mạnh mẽ hơn bằng cách mở rộng nó để hoạt động với nhiều tỷ lệ

Chúng tôi cũng phát hiện ra rằng trong trường hợp hình ảnh mẫu của chúng tôi cứng nhắc và được định dạng tốt, thì việc sử dụng bản đồ cạnh thay vì biểu diễn RGB hoặc thang độ xám có thể mang lại kết quả tốt hơn khi áp dụng khớp mẫu

Phương pháp đối sánh mẫu đa tỷ lệ của chúng tôi hoạt động tốt nếu chúng tôi chỉ quan tâm đến việc dịch và chia tỷ lệ; . Nếu mẫu hoặc hình ảnh đầu vào của chúng tôi hiển thị các loại biến đổi này, tốt hơn hết chúng tôi nên áp dụng tính năng phát hiện điểm chính, bộ mô tả bất biến cục bộ và đối sánh điểm chính

Tải xuống Mã nguồn và Hướng dẫn tài nguyên 17 trang MIỄN PHÍ

Nhập địa chỉ email của bạn dưới đây để có được một. zip của mã và Hướng dẫn tài nguyên 17 trang MIỄN PHÍ về Thị giác máy tính, OpenCV và Học sâu. Bên trong, bạn sẽ tìm thấy các hướng dẫn, sách, khóa học và thư viện được chọn lọc thủ công của tôi để giúp bạn thành thạo CV và DL

Chủ Đề