تصحیح جهت تصویر کارت اسکن شده با پایتون
یکی دیگر از کاربردهای مسئله تضیح داده شده در نوشته “کشف تصویر کوچک درون تصویر بزرگ با استفاده از پایتون و OpenCV” این هست که شما با استفاده از این کد می توانید یک نشانه خاص در کارت شناسایی را پیدا کرده و بر اساس آن تغییرات خاصی را اعمال کنید.
برای نمونه ما در اینجا یک نوع گواهینامه نمونه را که به صورت برعکس اسکن شده است به برنامه داده ایم و پس از پیدا کردن نشانه موجود در گوشه سمت راست و بالای کارت آن را به تعداد لازم rotate می کنیم تا تصویر گواهینامه با جهت درست نشان داده شود.
نمونه کد:
import cv2
def find_image_in_larger_image(small_image, large_image):
# Read images
# Check if images are loaded successfully
if small_image is None or large_image is None:
print("Error: Unable to load images.")
return None
# Get dimensions of both images
small_height, small_width = small_image.shape
large_height, large_width = large_image.shape
# Find the template (small image) within the larger image
result = cv2.matchTemplate(large_image, small_image, cv2.TM_CCOEFF_NORMED)
# Define a threshold to consider a match
threshold = 0.6
# Find locations where the correlation coefficient is greater than the threshold
locations = cv2.findNonZero((result >= threshold).astype(int))
# If no match is found
if locations is None:
return None
# Determine position of the matched areas
matched_positions = []
for loc in locations:
x, y = loc[0]
if x < large_width / 2:
position_x = "left"
else:
position_x = "right"
if y < large_height / 2:
position_y = "top"
else:
position_y = "bottom"
matched_positions.append((position_x, position_y))
return matched_positions
# Example usage
small_image_path = "mark.jpg"
large_image_path = "card.jpg"
small_image = cv2.imread(small_image_path, cv2.IMREAD_GRAYSCALE)
large_image = cv2.imread(large_image_path, cv2.IMREAD_GRAYSCALE)
rotated_large_image=large_image
positions = find_image_in_larger_image(small_image, large_image)
max_rotation = 10 # Set the maximum rotation limit
if positions:
position_x, position_y = positions[0]
print("Position: {}, {}".format(position_x, position_y))
while max_rotation>0:
max_rotation-=1
rotated_large_image = cv2.rotate(rotated_large_image, cv2.ROTATE_90_CLOCKWISE)
positions = find_image_in_larger_image(small_image, rotated_large_image)
if positions:
position_x, position_y = positions[0]
print("Position: {}, {}".format(position_x, position_y))
if(position_x=='right' and position_y=='top'):
cv2.imshow("Mark", small_image)
cv2.imshow("Original", large_image)
cv2.imshow("Result", rotated_large_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
max_rotation=0
else:
print("No match found after {} rotations.".format(10-max_rotation))
else:
print("No match found after {} rotations.".format(10-max_rotation))




