Ich versuche OpenCV die chamferMatching Funktion zu nutzen, auf OSX zu arbeiten, aber eine Fehlermeldung über einen gescheiterten Versuch, immer Objekte zu befreien, die nicht zugewiesen wurden (soweit ich das beurteilen kann):Wie bekomme ich chamerMatching, um unter OSX zu arbeiten?
fs(58697,0x100b3c000) malloc: *** error for object 0x103800000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
gefunden paar hilfreiche Beiträge wie diese beiden:
- chamerMatching malloc error
- debug assertion failed vc\include\vector vector iterator + offset out of range in chamferMatching Opencv
auf Ubuntu, s implizieren kompilieren OpenCV 2.4.1 von der Quelle und die Verwendung, die den Trick gemacht hat.
Das gleiche funktionierte jedoch nicht auf OSX. Ich habe auch die Vorlagen Deletion in dem Matching
destructor auf Kommentar:
~Matching()
{
for (size_t i = 0; i<templates.size(); i++) {
// delete templates[i];
}
}
aber keine Freude.
Ich habe sogar versucht, alle DELETE-Anweisungen in Chamfermatching.cpp kommentieren, aber ich bekomme immer noch den gleichen Fehler.
Update Ich habe versucht, OpenCV 2.4.1 mit 3 verschiedenen Versionen von g ++: 4.9, 5 und 6 neu zu kompilieren, aber ich bekomme Linkfehler. Hier ist ein Beispiel mit g ++ kompiliert 5:
g++-5 ../fs.cpp -I/Users/George/Downloads/Grouped/cv/opencv-2.4.1/build/install/include/opencv -I/Users/George/Downloads/Grouped/cv/opencv-2.4.1/build/install/include -L/Users/George/Downloads/Grouped/cv/opencv-2.4.1/build/install/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_videostab -o fs
Undefined symbols for architecture x86_64:
"cv::chamerMatching(cv::Mat&, cv::Mat&, std::vector<std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >, std::allocator<std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > > > >&, std::vector<float, std::allocator<float> >&, double, int, double, int, int, int, double, double, double, double)", referenced from:
_main in ccTJvcHd.o
"std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > cv::CommandLineParser::analyzeValue<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > cv::CommandLineParser::get<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) in ccTJvcHd.o
"cv::CommandLineParser::has(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > cv::CommandLineParser::get<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) in ccTJvcHd.o
"cv::CommandLineParser::getString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > cv::CommandLineParser::get<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) in ccTJvcHd.o
"cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)", referenced from:
_main in ccTJvcHd.o
"cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)", referenced from:
_main in ccTJvcHd.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
Ich habe versucht, Flaggen wie -std=c++11
dann -std=c++0x
hinzufügen, aber keine Freude.
Irgendwelche Tipps, wie ich über dieses Problem hinwegkommen könnte?