এই সমস্যায়, আমরা দেখব পাইথন কীভাবে একটি ইমেজ বা ভিডিও ফাইলের এজ ডিটেক্ট করতে পারে। এজন্য আমাদের OpenCV লাইব্রেরি দরকার। OpenCV লাইব্রেরি মূলত কম্পিউটার ভিশনের জন্য ডিজাইন করা হয়েছে। এটি ওপেন সোর্স। মূলত এটি Intel দ্বারা ডিজাইন করা হয়েছিল। এটি ওপেন-সোর্স BSD লাইসেন্সের অধীনে ফ্রি ব্যবহারযোগ্য।
OpenCV ফাংশনালিটি ব্যবহার করতে, pip ব্যবহার করে ডাউনলোড করতে হবে। OpenCV Numpy মডিউলও ডাউনলোড করবে। সেটিও দরকার হবে।
sudo pip3 install opencv-python
ইনপুট হিসেবে, এই কেসে, আমরা একটি ভিডিও ফাইল ব্যবহার করেছি। আমরা আমাদের ওয়েবক্যামও ব্যবহার করতে পারি এই এজ ডিটেকশন প্রসিডিউরর রিয়েল-টাইম ইফেক্ট দেখতে।
এখানে আমরা একটি ভিডিও ফাইল ব্যবহার করছি। এক्चুয়াল ইমেজ (ভিডিওর ফ্রেম) এর মত দেখাচ্ছে:

এজ ডিটেকশন কীভাবে কাজ করে?
এজ ডিটেক্ট করতে, কিছু ম্যাথমেটিক্যাল অবজারভেশন আছে যা চেক করে পিক্সেলের ব্রাইটনেস স্পষ্টভাবে পরিবর্তিত হচ্ছে কিনা।
আমাদের আমাদের ইমেজের গ্রে-স্কেল ভার্সনের গ্রেডিয়েন্ট বের করতে হবে। কম্পিউটার ভিশনে, যখন পিক্সেল ব্ল্যাক থেকে হোয়াইটে ট্রানজিশন করে, এটি পজিটিভ স্লপ হিসেবে নোট করা হয়। হোয়াইট থেকে ব্ল্যাক ট্রানজিশনের জন্য, এটি নেগেটিভ স্লপ।
ইমেজের ডেরিভেটিভ ব্যবহার করে এজ ডিটেকশন
একটি ইমেজ একটি ম্যাট্রিক্স হিসেবে সংরক্ষিত হয়, যেখানে সেই ম্যাট্রিক্সের প্রতিটি এলিমেন্ট সকল পিক্সেলের ইনফরমেশন ধারণ করে। ডেরিভেশন বের করতে আমাদের লাপ্লাসিয়ান অপারেটর দরকার। তাই লাপ্লাসিয়ান পেতে, প্রথমে সোবেল ডেরিভেটিভ দরকার। এই সোবেল ডেরিভেটিভগুলো ইমেজের গ্রেডিয়েন্ট ভেরিয়েশন পেতে ব্যবহৃত হয়।
হরিজন্টাল সোবেল ডেরিভেটিভ (Sobel X)
এই সোবেল ডেরিভেটিভ একচুটি ম্যাট্রিক্স (কলড কernel) এর সাথে একচুটি ইমেজের কনভলিউশন দিয়ে পাওয়া যায়। কernelটি সিম্পল কেসে 3x3 ম্যাট্রিক্স।
sobel() নামে একটি ফাংশন রয়েছে। এই ফাংশন ব্যবহার করে আমরা সোবেল ডেরিভেটিভ বের করতে পারি। যখন সোবেল x পাওয়ার চেষ্টা করছি, y পার্টটি ০ হওয়া উচিত।
উদাহরণ কোড
import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') # ভিডিও ফাইল থেকে ফ্রেম ক্যাপচার
while(capture.isOpened()): # ভিডিও শেষ হওয়া পর্যন্ত লুপ চালান
ret, frame = capture.read() # ভিডিও থেকে ফ্রেম ফেচ করুন
# BGR কালারকে HSV (Hue Saturation Value) মোডে রূপান্তর
hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# SobelX মেথড
sobelx = cv2.Sobel(frame, cv2.CV_64F, 1, 0, ksize=5)
cv2.imshow('SobelX', sobelx)
k = cv2.waitKey(5) & 0xFF
if k == 27: # 27 ESC কী-এর ASCII। ESC চাপলে বন্ধ হবে
break
capture.release()
cv2.destroyAllWindows() # উইন্ডো রিমুভ করার পর মেমরি ক্লিন করুন
আউটপুট

ভার্টিক্যাল সোবেল ডেরিভেটিভ (Sobel Y)
একইভাবে sobel() ফাংশন ব্যবহার করে ভার্টিক্যাল সোবেল ডেরিভেটিভ বের করা যায়। এই কেসে x পার্টটি ০ হবে।
উদাহরণ কোড
import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4')
while(capture.isOpened()):
ret, frame = capture.read()
hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# SobelY মেথড
sobely = cv2.Sobel(frame, cv2.CV_64F, 0, 1, ksize=5)
cv2.imshow('SobelY', sobely)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
capture.release()
cv2.destroyAllWindows()
আউটপুট

লাপ্লাসিয়ান ডেরিভেটিভ
শেষে, আমরা ইমেজের লাপ্লাসিয়ান ডেরিভেটিভ দেখব। Laplacian() নামে একটি ফাংশন রয়েছে। এটি ডেরিভেটিভ পেতে ব্যবহৃত হয়।
উদাহরণ কোড
import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4')
while(capture.isOpened()):
ret, frame = capture.read()
hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Laplacian মেথড
laplacian = cv2.Laplacian(frame, cv2.CV_64F)
cv2.imshow('Laplacian', laplacian)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
capture.release()
cv2.destroyAllWindows()
আউটপুট
