2012-06-07 22 views
31

Mam dwa Mat obrazy w OpenCV:Mnożenie macierzy w OpenCV

Mat ft = Mat::zeros(src.rows,src.cols,CV_32FC1); 
Mat h = Mat::zeros(src.rows,src.cols,CV_32FC1); 

Oba obrazy są takie same wymiary i oblicza się z jednego źródła obrazu.

chciałbym mnożyć te dwa obrazy, ale próbowałem z wykorzystaniem zarówno

Mat multiply1 = h*ft; 

Mat multiply2; 
gemm(h,ft,1,NULL,0,multiply2); 

ale oba wyniki w następujący błąd potwierdzenia:

OpenCV Error: Assertion failed (a_size.width == len) in unknown function, file ...matmul.cpp Termination called after throwing 'cv::exception'

Co robię źle?

+0

aby zobaczyć co wyjątek rzeczywiście _says_, umieścić linię niedostatecznej wewnątrz 'try' bloku jak: try {' [...]} catch (Exception cv :: const & e) {std :: cerr << "Wyjątek OpenCV:" << e.what() << std :: endl; } ' –

Odpowiedz

88

Mówisz, że macierze mają te same wymiary, a mimo to próbujesz wykonać na nich mnożenie macierzy. Mnożenie macierzy o tym samym wymiarze jest możliwe tylko wtedy, gdy są kwadratowe. W twoim przypadku pojawi się błąd potwierdzenia, ponieważ wymiary nie są kwadratowe. Podczas mnożenia macierzy należy zachować ostrożność, ponieważ istnieją dwa możliwe znaczenia mnożenia.

Matrix multiplication to miejsce, w którym dwie macierze są mnożone bezpośrednio. Ta operacja mnoży macierz A o wielkości [a x b] z macierzą B o rozmiarze [b x c], aby wytworzyć macierz C o wielkości [a x c]. W OpenCV to odbywa się za pomocą prostego * operatora:

C = A * B 

Element-wise multiplication jest, gdy każdy piksel w macierzy wyjściowej jest utworzona przez pomnożenie tego piksela w macierzy w odpowiedniej pozycji w macierzy B. matryce wejściowe powinny być tego samego rozmiaru, a wynik będzie również tej samej wielkości. Osiąga się to za pomocą mul() funkcję:

output = A.mul(B); 
+0

Przepraszam, ale nie widzę, jak to odpowiada na pytanie. Dlaczego twierdzenie nie powiedzie się w pierwszym stwierdzeniu "h * ft"? – Devesh

+3

Ponieważ w obecnej postaci h * ft próbuje wykonać mnożenie macierzy, która, zauważając, jak formowane są h i ft, wymagałaby src.rows == src.cols. – Chris

+0

O tak, oczywiście. Zakładałem, że są równi. Mój błąd. – Devesh

Powiązane problemy