13

我正在使用从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);

测试图像

测试图像

4

2 回答 2

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 文件上传到保管箱,所以我可以测试它。

于 2013-01-12T04:34:26.150 回答
2

请参阅此帖子:此类错误可能是由于在发布模式下链接到 opencv 的调试库引起的。

于 2012-12-20T12:02:37.223 回答