我使用從MIT cars dataset培訓的Haar級聯分類器來檢測OpenCV中的車輛(使用OpenCV提供的實用程序進行了培訓)。在Debug模式下編譯時,這種方式運行得相當好,但在Release模式下編譯時,級聯根本不會進行任何檢測。在下面的測試圖像上運行以下代碼可以在調試模式下進行檢測,但在發佈模式下不會發生任何問題(此行爲可以通過數據序列中的所有圖像繼續進行)在釋放/調試模式下與Haar級聯的不同結果
你能否提出爲什麼會出現這種情況,更重要的是,我能做些什麼來獲得在Release模式下運行時的檢測結果?
代碼
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
圖像和級聯文件加載正常,在我的實際代碼中我使用完整的目錄路徑。據我所知,這兩種模式都沒有錯誤,唯一的區別是detectMultiScale返回的對象數量。 – Chris
好的:/我刪除了我的第一條評論,因爲關於png的部分是不相關的。 –
這通常表示擁有UB並依賴於特定行爲(無論是在代碼中還是在庫中)或依賴於特定生成的不同代碼(例如,由於在發佈模式下駐留在寄存器中的浮點精度)而存在的跡象。您可以在這裏做的最好的事情是在兩種模式下逐步比較所有涉及的計算,並找出它們開始偏離的位置 – PlasmaHH