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

Chr*_*ris 13 c++ opencv release-mode debug-mode

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

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

级联文件

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);
Run Code Online (Sandbox Code Playgroud)

TestImage

testImage

cyr*_*iel 3

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

  2. 一般来说,我建议仔细检查项目配置。很容易犯一些小错误,从而导致非常奇怪的行为。有时,最好的选择是再次从头开始配置所有内容。

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

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