Saya mencoba mendeteksi jumlah pipa dalam gambar ini. Untuk ini, saya menggunakan deteksi berbasis OpenCV dan Python. Berdasarkan, pada jawaban yang ada untuk pertanyaan serupa, saya dapat menemukan langkah-langkah berikut
- Buka gambar
- Saring
- Terapkan Deteksi Tepi
- Gunakan Kontur
- Periksa hitungannya
Jumlah total pipa adalah ~ 909 ketika kami menghitung secara manual, beri atau ambil 4.
Setelah menerapkan filter
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
Saya mendapatkan gambar bertopeng ini
Ini terlihat cukup akurat dalam hal jumlah persegi panjang yang terlihat itu menunjukkan. Namun, ketika saya mencoba mengambil hitungan dan memplot kotak pembatas di atas gambar, ia mengambil banyak wilayah yang tidak diinginkan juga. Untuk lingkaran, HoughCircles memiliki cara untuk menentukan radius maks dan min. Apakah ada yang serupa untuk persegi panjang yang dapat meningkatkan akurasi. Juga, saya terbuka untuk saran untuk pendekatan alternatif untuk masalah ini.
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)
PEMBARUAN Berdasarkan jawaban kedua saya telah mengonversi kode c ++ ke kode python dan mendapatkan hasil yang lebih dekat tetapi masih kehilangan beberapa persegi panjang yang jelas.