2013-11-25 13 views
5

łatwe pytanie, ale nie można tego rozgryźć.Jak powinna wyglądać maska ​​cv :: dla opencv minMaxLoc?

normalnie jej nieważności minMaxLoc (InputArray src dwukrotnie * MINVAL dwukrotnie * MAXVAL = 0, punkt * minLoc = 0, punkt * maxLoc = 0, InputArray maska ​​= noArray()) Ale jak maska ​​wygląda?

Oto czego chcę: jest to jednowymiarowa mata (tylko jeden rząd) i chcę mieć położenie minMax odstępu (dolnego do górnego) macie (maxRowGChnnl).

int lowerBorder,upperBorder; 
lowerBorder = 30; 
upperBorder = 100; 
cv::minMaxLoc(maxRowGChnnl.row(0),&minValue,&maxValue,&minLoc,&maxLoc,(lowerBorder,upperBorder)); 

Jest to rozmiar maxRowGChnnl:

maxRowGChnnl {flags=1124024325 dims=2 rows=1 ...} cv::Mat 
flags 1124024325 int 
dims 2 int 
rows 1 int 
cols 293 int 

Powyższy kod abborts z:

OpenCV Error: Assertion failed ((cn == 1 && (mask.empty() || mask.type() == CV_8 
U)) || (cn >= 1 && mask.empty() && !minIdx && !maxIdx)) in unknown function, fil 
e ..\..\..\src\opencv\modules\core\src\stat.cpp, line 787 

Dzięki za pomoc.

Odpowiedz

5

Tak naprawdę nie potrzebujesz maski, ale pod-macierzy maxRowGChnnl. Możesz to zrobić przez:

cv::minMaxLoc(maxRowGChnnl(Rect(lower,0,upper-lower,0)),&minValue,&maxValue,&minLoc,&maxLoc); 
+0

to jest odpowiedź, którą myślałem (sposób jest rozwiązany). Ale tak naprawdę to nie zadziałało. Podczas drukowania maxLoc ponownie zapisuję [-1, -1]. Podczas drukowania maxRowGChnnl (cv :: Rect (lower, 0, upper-lower, 0)) wynik jest [] - pusty. Ale Mat maxRowGChnnl ma w sobie wartości! Co ja robię źle? – user1651460

+1

Oups. Mój błąd. Wysokość powinna oczywiście wynosić 1. Nie 0. Użyj maxRowGChnnl (cv :: Rect (niżej, 0, upper-lower, 1)) –

+0

Idealny. To jest to! dobrze widzę teraz budowę recta. – user1651460

4

maska ​​powinna być cv :: Mat tego samego rozmiaru co axRowGChnnl.row (0) i typ CV_8UC1. Elementy włączone powinny mieć wartości równe 1 wyłączone 0.

Powiązane problemy