2012-02-09 11 views
7

Poniższy kod będzie opublikować komunikat o błędzie:OpenCV - asercja nie (dst.data == dst0.data) w cvCvtColor

// object is a color image with type cv::Mat 

IplImage* temp_object = &(IplImage)object; 
IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 3); 
assert(temp_object->nChannels == 3 && temp_object->depth == IPL_DEPTH_8U); 
assert(ipl_object->nChannels == 3 && ipl_object->depth == IPL_DEPTH_8U); 
cvCvtColor(ipl_object, temp_object, CV_BGR2GRAY); 

błąd

OpenCV Error: Assertion failed (dst.data == dst0.data) in cvCvtColor, file /opt/local /var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.3.1/modules/imgproc/src/color.cpp, line 3175 terminate called throwing an exception`

zaktualizowanego kodu po modyfikacji (teraz powinno działać). Dzięki za pomoc!

IplImage temp_object (object); 
IplImage* ipl_object = cvCreateImage(cvGetSize(&temp_object), 8, 1); 
cvCvtColor(&temp_object, ipl_object, CV_BGR2GRAY); 

Odpowiedz

7
IplImage* temp_object = &(IplImage)object; 

To nie daje wskaźnik do object, zinterpretowane jako IplImage; zamiast tego tworzy tymczasowy IplImage z , daje wskaźnik do tego, a następnie niszczy tymczasowy, pozostawiając nieważne wskazujące na nic ważne. Użycie następnie temp_object da niezdefiniowane zachowanie.

nie jestem zaznajomiony z biblioteki, ale może chcesz wskaźnik do object (jeśli IplImage jest podtypem niezależnie od typu object jest):

IplImage* temp_object = static_cast<IplImage *>(&object); 

używając obsadę przekonwertować wskaźnik (lub odniesienie, jeśli wolisz), a nie sam obiekt.

A może chcesz nowy (nietymczasowe) obiektu:

IplImage temp_object(object); 
+0

Dzięki za wyjaśnienie. 'IplImage * temp_object = static_cast (& object);' wyda 'błąd: nieprawidłowy static_cast z typu 'cv :: Mat *' na typ 'IplImage *'' – LKS

+0

@ user1020390: W takim przypadku, być może chcesz zrobić nowy obiekt; musisz nadać mu nazwę, aby nie była tymczasowa. Zobacz moją edycję. –

+0

Dzięki. Myślę, że teraz powinno działać. – LKS

4

Inną kwestią jest, że CV_BGR2GRAY oczekuje przeznaczenia za pojedynczy kanał, a nie potrójne. Również podpis cvCvtColor() rozpoczyna się od SRC, a następnie DST. Prawdopodobnie chcesz zmienić swój kod na coś takiego:

IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 1); 
cvCvtColor(&object, ipl_object, CV_BGR2GRAY); 
+0

Dzięki! Popełniłem błąd w cvCvtColor. Twoja rada jest właściwa. Właśnie to zamierzam zrobić. Jak również skomentowałem powyżej, nie mogę utworzyć temp_object z właściwym typem z linii 'IplImage * temp_object = static_cast (& object);'. Błąd powiedział, że jest nieprawidłowy static_cast. Czy myliłem się gdzieś? – LKS

+1

Dzięki. Myślę, że teraz powinno działać. – LKS

Powiązane problemy