2016-03-24 15 views
1

Gerçek ROI içinde algılanan nesnenin (kullandığım mavi işaretçi) alanını hesaplamak istiyorum. Eşik resmindeki İlgi Bölgelerim olan (siyah beyaz olan) bu iki dikdörtgenden birini kastediyorum.OpenCV içinde ROI içindeki nesne alanını hesaplayın

Nasıl nesnenin alanını hesaplamak için (bence - piksel "tanınan" kümenin toplamı, beyaz renk olan) ROI içinde ? (- sol Bir örnek aşağıda)

enter image description here

Sadece beton ROI içerde sadece bu pikselleri düşünebilirsiniz. Dolayısıyla, sol ROI’nın dışındaki tüm pikseller hesaplamalara alınmayacaktır.

enter image description here

ROI böyle oluşturulur:

rectangle(imgOriginal, Point(20, 100), Point(170, 250), Scalar(0, 0, 255), +5, 4); 
rectangle(imgThresholded, Point(20, 100), Point(170, 250), Scalar(255, 255, 255), +5, 4); 
rectangle(imgOriginal, Point(450, 100), Point(600, 250), Scalar(0, 0, 255), +5, 4); 
rectangle(imgThresholded, Point(450, 100), Point(600, 250), Scalar(255, 255, 255), +5, 4); 
+0

böylece soldaki dikdörtgenin içindeki büyük konturun (beyaz) alanını mı istiyorsunuz? –

+0

Evet, yalnızca sol taraftaki ROI içinde bu konturun (üstteki görüntünün üzerinde bulunan mavi işaretçi) alanı. – Chris92

cevap

2

İçinde ROI içinde sıfır olmayan pikselleri saymak için cv::countNonZero işlevini kullanabilirsiniz. imgThresholded resim. Bu tam olarak ihtiyacın olan şey.

cv::Rect leftROI(cv::Point(20, 100), cv::Point(170, 250)); 
int leftArea = cv::countNonZero(imgThresholded(leftROI)); 
+0

Tüm bu Eşik resmi içeriği gibi hesaplayabilir miyim? Cv :: Rect leftROI (cv :: Point (0, 0), cv :: Point (640, 480)); '' point'si tam olarak girin İkili görüntünün boyutu (genişlik ve yükseklik)? Ve bundan sonra, seçili YG'de beyaz piksellerin toplamından tam ikili görüntüdeki beyaz piksellerin toplamını çıkarabilir miyim? Tüm alanın beyaz piksellerinin (ROI hariç) azaldığını ve aynı zamanda ROI içindeki beyaz piksellerin miktarını artırdığını hesaplayarak işaretçi renginin tespitini kalibre etmek istiyorum. Öyleyse, ROI alanında daha fazla beyaz piksel görünür/algılanır - böylece nesne doğru bir şekilde algılanır. – Chris92

+1

Elbette yapabilirsin. Seçilen ROI'daki beyaz piksellerin toplamının tam ikili görüntüdeki beyaz piksellerin toplamına oranını bulmak daha iyi olabilir. Ayrıca, "cv :: countNonZero (imgThresholded)" – akarsakov

+0

kullanarak tam ikili görüntüde beyaz pikselleri sayabilirsiniz. Bu kod, ** solArea ** 'dan ** imgTresholded **' dan çıkarma sorunum dışında çalışır. Bu gibi çalışıyorum: cv :: Rect leftROI (cv :: Point (25, 105), cv :: Point (165, 245)); int leftArea = cv :: countNonZero (imgThresholded (leftROI)); int hariç tutuldu; çıkarma (cv :: countNonZero (imgThresholded), leftArea, hariç); '- ve hata aldım ** 'int' dan 'cv :: OutputArray' '**' a dönüştürmek için uygun bir kurucu yok. "Int excluded" niçin doğru tür değilse, geri kalanı 'int' olduğunda? "Mat hariç" ile yapabilirim. Ancak, resim beyaz piksel içermiyorsa, yine de 0 yerine bir miktar rakam gösterir. – Chris92

0

Yani kanuna etrafında bir dikdörtgen çizip alanını almak için şimdi çalışıyor, bazı renk filtreleme dayanan "büyük kontur" bulundu. alanını elde etmek için, OpenCv (o büyük olduğunu nasıl buldunuz?) sizin için işlevini temin işte fonksiyonudur: Ben ancak olduğu gibi kontur gönderebilir düşünüyorum çünkü double cv::contourArea(InputArray contour)

Here ana sayfaya edilir emin değilim ama bu temel çek örneği ve:

vector<Point> contour; 
contour.push_back(Point2f(0, 0)); // push whatever points you want 
contour.push_back(Point2f(10, 0)); 
contour.push_back(Point2f(10, 10)); 
contour.push_back(Point2f(5, 4)); 
double area0 = contourArea(contour); // retrieve the area 

vector<Point> approx; 
approxPolyDP(contour, approx, 5, true); 
double area1 = contourArea(approx); 
cout << "area0 =" << area0 << endl << 
     "area1 =" << area1 << endl << 
     "approx poly vertices" << approx.size() << endl; 
0

bir ikili görüntü üzerinde belirli ROI için piksel değerlerine ile süpürme ve beyaz (255) olanları sayar. Daha fazla ROI'niz varsa ve beyaz piksel içermeyenleri önlemek istiyorsanız, o zaman beyaz piksel içermeyenleri atlayın ...