2012-06-20 11 views

Odpowiedz

13

imread zwraca wartość Mat, a nie CvMat. Są to dwa różne interfejsy (C++ i Ipl ... i Cv .. dla interfejsu C).

Interfejs C++ jest ładniejszy, bezpieczniejszy i łatwiejszy w użyciu. Automatycznie obsługuje pamięć dla ciebie i pozwala ci pisać mniej kodu dla tego samego zadania. Chłopaki OpenCV opowiadają się za wykorzystaniem C++, chyba że pewne bardzo specyficzne wymagania projektowe zmusić cię do C.

Przykład (C++)

cv::Mat image = imread("path/to/myimage.jpg") 
if(image.empty()) 
    return; 

cv::imshow("Image", image); 

cv::Mat bw = image > 128; // threshold image 
cv::Mat crop = image(cv::Rect(0, 0, 100, 100)); // a 100px x 100px crop 
crop= 0; // set image to 0 

cv::waitKey(); 
// end code here 

pamiętać, że jeśli nie zaznaczono inaczej, wszystkie zadania matrix odwołać te same dane . W powyższym przykładzie crop punktów matrycy image i ustawienie go na zero ustali, że określonej części image 0.

Aby utworzyć nową kopię danych, należy użyć Mat :: copyTo, lub macie :: clone();

i C interfejs

IplImage* pImg = CvLoadImage("path/to/myimage.jpg"); 
if(pImg == NULL) 
    return; 

// ... big bloat to do the same operations with IplImage  

CvShowImage("Image", pImg); 
cvWaitKey(); 
CvReleaseImage(&pImg); // Do not forget to release memory. 
// end code here 
0

IplImage i podkładki są zarówno między zamienny.

Proponuję użyć Mat i imread(), ponieważ bardzo łatwo jest uzyskać dane z Mat.

Mat :: dane zwraca wskaźnik do rzeczywistych danych matrycy, które w 1D i wartości są łatwo dostępne. http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=mat#union%20data

Jeśli chcesz dodać koncepcje uczenia maszynowego w OpenCV dla różnych algorytmów śledzenia (np. OpenTLD), możesz łatwo uzyskać dostęp do danych za pomocą Mat.data, aby uzyskać wskaźnik do rzeczywistej macierzy.

Wiele narzędzi OpenCV (np. CalcOpticalFlowPyrLK itp.) Wymaga Mat. Proponuję użyć Mat. IplImage to już stara rzecz.

0

To zależy od tego, jak wygodne jesteś z pointers.In IplImage można uzyskać dostęp do danych, jak

data[i*widthstep+j*nchannels +k] 

gdzie i, j, k są liczbami całkowitymi niektórzy co jest dość proste podejście. W normalnej macierzy 3-wymiarowej nie jest to łatwy dostęp do danych. Do normalnego dostępu do danych matryca jest na [i] [j]

*(*(a + i) + j) is the value of jth element of ith row in matrix a 
0

Od OpenCV_2 książki kucharskiej:

Struktura ta była dziedziczona z biblioteki IPL (czyli Intel Przetwarzanie obrazu Library) teraz zintegrowany z biblioteka IPP (zintegrowana biblioteka Primitive Performance Primitive Intel ).Jeśli użyjesz kodu i bibliotek, które zostały utworzone przy użyciu starego interfejsu C, konieczne może być manipulowanie strukturami IplImage. Na szczęście, istnieje wygodny sposób konwersji IplImage na obiekt cv :: Mat.

IplImage * iplImage = cvLoadImage ("c: \ img.jpg"); cv :: Mat image4 (iplImage, false);

Funkcja cvLoadImage to funkcja interfejsu C do ładowania obrazów. Drugi parametr w konstruktorze obiektu cv :: Mat wskazuje, że dane nie zostaną skopiowane (ustawione na true, jeśli chcesz nową kopię, a wartość false jest wartością domyślną, więc można ją było pominąć), to jest zarówno IplImage, jak i image4, będą dzielić te same dane obrazu. Musisz być ostrożny pod tym kątem, aby nie tworzyć zwisających wskaźników. Z tego powodu, że bezpieczniej jest kapsułkowanie wskaźnik IplImage do klasy odniesienia wskaźnika zliczania dostarczonych przez OpenCV 2:

cv :: Ptr iplImage = cvLoadImage ("C: \ img.jpg");

W przeciwnym razie, jeśli trzeba cofnąć przydział pamięci wskazywanej przez struktury IplImage, ty trzeba zrobić to wyraźnie: cvReleaseImage (& iplImage); Należy pamiętać, że należy unikać używania tej wycofanej struktury danych. Zamiast tego zawsze używaj cv :: Mat.

Powiązane problemy