আমি এই ছবিতে পাইপের গণনা সনাক্ত করার চেষ্টা করছি। এর জন্য, আমি ওপেনসিভি এবং পাইথন-ভিত্তিক সনাক্তকরণ ব্যবহার করছি। অনুরূপ প্রশ্নের বিদ্যমান উত্তরগুলির ভিত্তিতে, আমি নিম্নলিখিত পদক্ষেপগুলি নিয়ে আসতে সক্ষম হয়েছি
- ছবিটি খুলুন
- এটি ফিল্টার করুন
- এজ সনাক্তকরণ প্রয়োগ করুন
- ব্যবহার করুন
- গণনা পরীক্ষা করুন
পাইপগুলির মোট গণনা ~ 909 হয় যখন আমরা এটি ম্যানুয়ালি গণনা করি বা 4 নিই।
ফিল্টার প্রয়োগের পরে
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('images/input-rectpipe-1.jpg')
blur_hor = cv2.filter2D(img[:, :, 0], cv2.CV_32F, kernel=np.ones((11,1,1), np.float32)/11.0, borderType=cv2.BORDER_CONSTANT)
blur_vert = cv2.filter2D(img[:, :, 0], cv2.CV_32F, kernel=np.ones((1,11,1), np.float32)/11.0, borderType=cv2.BORDER_CONSTANT)
mask = ((img[:,:,0]>blur_hor*1.2) | (img[:,:,0]>blur_vert*1.2)).astype(np.uint8)*255
আমি এই মুখোশযুক্ত ছবি পেতে
এটি প্রদর্শিত হওয়া আয়তক্ষেত্রগুলির সংখ্যার দিক থেকে এটি মোটামুটি নির্ভুল দেখাচ্ছে। যাইহোক, যখন আমি গণনাটি নেওয়ার চেষ্টা করি এবং ছবির উপরে বাউন্ডিং বক্সটি প্লট করি তখন এটি অনেকগুলি অযাচিত অঞ্চলগুলিকেও পছন্দ করে। চেনাশোনাগুলির জন্য, HoughCircles সর্বাধিক এবং ন্যূনতম ব্যাসার্ধ নির্ধারণ করার একটি উপায় রয়েছে। আয়তক্ষেত্রগুলির জন্য কি অনুরূপ কিছু রয়েছে যা নির্ভুলতার উন্নতি করতে পারে। এছাড়াও, আমি এই সমস্যার বিকল্প পদ্ধতির পরামর্শের জন্য উন্মুক্ত।
ret,thresh = cv2.threshold(mask,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
count = 0
for i in range(len(contours)):
count = count+1
x,y,w,h = cv2.boundingRect(contours[i])
rect = cv2.minAreaRect(contours[i])
area = cv2.contourArea(contours[i])
box = cv2.boxPoints(rect)
ratio = w/h
M = cv2.moments(contours[i])
if M["m00"] == 0.0:
cX = int(M["m10"] / 1 )
cY = int(M["m01"] / 1 )
if M["m00"] != 0.0:
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
if (area > 50 and area < 220 and hierarchy[0][i][2] < 0 and (ratio > .5 and ratio < 2)):
#cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
cv2.circle(img, (cX, cY), 1, (255, 255, 255), -1)
count = count + 1
print(count)
cv2.imshow("m",mask)
cv2.imshow("f",img)
cv2.waitKey(0)
আপডেট দ্বিতীয় উত্তরের ভিত্তিতে আমি সি ++ কোডটিকে পাইথন কোডে রূপান্তর করেছি এবং নিকটতর ফলাফল পেয়েছি তবে এখনও কয়েকটি সুস্পষ্ট আয়তক্ষেত্র মিস করছি।