2013-02-28 5 views
8

stavo lavorando omografia e ogni volta che provo per controllare i valori di matrice H (tipo CV_64F) utilizzando H.at<float>(i, j) ottengo numeri casuali (talvolta valore spazzatura). Voglio accedere ai valori dei pixel della matrice mobile. C'è modo di farlo?Come accedere ai valori dei pixel di CV_32F/CV_64F Mat?

Mat A = Mat::eye(3, 3, CV_64F); 
float B; 
for(int i=0; i<A.rows; i++) 
{ 
    for(int j=0; j<A.cols; j++) 
    { 
     printf("%f\n", A.at<float>(i, j)); 
    } 
} 

imshow("identity", A); 
waitKey(0); 

Questo dimostra corretta immagine di una matrice di identità, ma durante il tentativo di accedere ai valori dei pixel, ottengo

0,000000 1,875000 0,000000 0,000000 0,000000 0,000000 0,000000 0,000000 0,000000

Perché è così?

risposta

16

si dovrebbe provare questo:

A.at<double>(i, j); 

perché la vostra matrice è di "tipo" CV_64F che a sua volta significa che contiene elementi di tipo double, non float.

A proposito, io non sono sicuro se si è consapevoli di questo, ma è possibile utilizzare cout per stampare la matrice in questo modo:

std::cout << A << std::endl; 

ho trovato questo per essere utile per il controllo di una piccola matrice o una fetta di una matrice.

+0

oh. freddo. quello ha funzionato. Grazie. :) – Froyo

+0

Forse puoi contrassegnare la mia risposta come corretta. Grazie. – lightalchemist

3

L'esempio seguente inizializza una matrice di Hilbert:

Mat H(100, 100, CV_64F); 
for(int i = 0; i < H.rows; i++) 
    for(int j = 0; j < H.cols; j++) 
     H.at<double>(i,j)=1./(i+j+1); 

tenga presente che l'identificatore di formato utilizzato nell'almeno operatore non può essere scelto a caso. Dipende dall'immagine da cui stai cercando di recuperare i dati. La seguente tabella fornisce una panoramica più approfondita:

Se la matrice è di tipo CV_8U, utilizzare Mat.at<uchar>(y,x).

Se la matrice è di tipo CV_8S, utilizzare Mat.at<schar>(y,x).

Se la matrice è di tipo CV_16U, utilizzare Mat.at<ushort>(y,x).

Se la matrice è di tipo CV_16S, utilizzare Mat.at<short>(y,x).

Se la matrice è di tipo CV_32S, utilizzare Mat.at<int>(y,x).

Se matrice è di tipo CV_32F quindi utilizzare Mat.at<float>(y,x).

Se la matrice è di tipo CV_64F, utilizzare Mat.at<double>(y,x).

(Tratto da OpenCV docs)

+0

bel riassunto, grazie! –