在发布/调试模式下,Haar级联的结果不同

时间:2012-12-20 11:48:08

标签: c++ opencv release-mode debug-mode

我正在使用从MIT cars dataset训练的Haar级联分类器来检测OpenCV中的车辆(使用随OpenCV提供的实用程序进行训练)。在调试模式下编译时,这种方法工作得相当好,但是在发布模式下编译时,级联根本不会进行任何检测。在下面的测试图像上运行以下代码可以在调试模式下进行检测,但在发布模式下没有任何内容(此行为会继续通过我的数据序列中的所有图像)。

你能说出为什么会这样吗,更重要的是,在发布模式下运行时我能做些什么才能获得检测?

Cascade File

代码

cv::Mat testImage = cv::imread("testImage.png",0);
cv::equalizeHist(testImage, testImage);

cv::CascadeClassifier vehicleCascade;
vehicleCascade.load("cars3.xml");

// Detect vehicles
std::vector<cv::Rect> cars;
vehicleCascade.detectMultiScale(
    testImage,                  // Input image
    cars,                   // Output bounding boxes
    1.1,                    // scale factor - how much image size is reduced at each scale
    5,                      // min neighbours - how many neighbours required to maintain rect
    0|CV_HAAR_SCALE_IMAGE,  // Not used
    cv::Size(30,30),        // Min poss object size
    cv::Size()              // Max poss object size
    );

std::cout << "Found " << cars.size() << " objects.\n";

for (int i=0; i<cars.size(); ++i)
    cv::rectangle(testImage, cars.at(i), CV_RGB(255,0,0), 3);

cv::namedWindow("Haar cascade");
cv::imshow("Haar cascade", testImage);
cv::waitKey(0);
cv::imwrite("output.png", testImage);

TestImage

testImage

2 个答案:

答案 0 :(得分:3)

  1. 这很奇怪,但对我来说,你的代码在两种模式下都能正常工作。我在Windows 7 32bit上使用Visual Studio 2010。这是我的项目 - https://www.dropbox.com/s/5kubn5tlu7k6ziy/opencvhw.rar,因此您可以检查可执行文件(Release和Debug目录)。如果您正在使用visual studio并希望自己构建它,则必须更改库的路径并包含两种模式的目录(包括目录路径相同,库目录路径不同)。 (项目 - &gt; ...属性 - &gt;配置属性 - &gt; vc ++目录)

  2. 一般情况下,我建议您仔细检查项目配置。制造一个可能导致非常奇怪的行为的小错误真的很容易。有时最好的选择是再次从头开始配置所有内容。

  3. OpenCV有非常奇怪的错误 - 它不是什么新东西:)例如我在调试时不能使用一些编解码器 - 如果我在调试模式下运行程序,但没有调试一切都很好,但如果我尝试调试 - 从文件中提取的每个帧都是空的(但它的大小是正确的)。 你可能刚刚遇到了类似的东西。尝试将图像转换为不同的格式(我认为bmp是测试的最佳选择 - 它应该始终在没有任何其他库的情况下工作)。

  4. 另请注意,您已经上传了jpg文件,所以我必须自己重命名和转换它 - 也许在转换期间,此文件中的某些内容已更改,因此我们不会在完全相同的文件上测试您的代码 - 上传您dropbox上的png文件,所以我可以测试它。

答案 1 :(得分:2)

post: 在发布模式下链接到opencv的调试库可能会导致此类错误。