2012-12-20 56 views
13

我使用從MIT cars dataset培訓的Haar級聯分類器來檢測OpenCV中的車輛(使用OpenCV提供的實用程序進行了培訓)。在Debug模式下編譯時,這種方式運行得相當好,但在Release模式下編譯時,級聯根本不會進行任何檢測。在下面的測試圖像上運行以下代碼可以在調試模式下進行檢測,但在發佈模式下不會發生任何問題(此行爲可以通過數據序列中的所有圖像繼續進行)在釋放/調試模式下與Haar級聯的不同結果

你能否提出爲什麼會出現這種情況,更重要的是,我能做些什麼來獲得在Release模式下運行時的檢測結果?

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

+0

圖像和級聯文件加載正常,在我的實際代碼中我使用完整的目錄路徑。據我所知,這兩種模式都沒有錯誤,唯一的區別是detectMultiScale返回的對象數量。 – Chris

+0

好的:/我刪除了我的第一條評論,因爲關於png的部分是不相關的。 –

+0

這通常表示擁有UB並依賴於特定行爲(無論是在代碼中還是在庫中)或依賴於特定生成的不同代碼(例如,由於在發佈模式下駐留在寄存器中的浮點精度)而存在的跡象。您可以在這裏做的最好的事情是在兩種模式下逐步比較所有涉及的計算,並找出它們開始偏離的位置 – PlasmaHH

回答

3
  1. 很奇怪,但對我來說,你的代碼是工作在兩種模式下的罰款。我在Windows 7 32位上使用Visual Studio 2010。這是我的項目 - https://www.dropbox.com/s/5kubn5tlu7k6ziy/opencvhw.rar,所以你可以檢查可執行文件(Release和Debug目錄)。如果您正在使用Visual Studio並想自行構建它,則必須更改路徑到庫幷包含兩種模式的目錄(包括目錄路徑相同,庫目錄路徑不同)。 (項目 - > ...屬性 - >配置屬性 - > vC++目錄)

  2. 通常我會建議仔細檢查項目配置。犯小錯誤很容易,這會導致非常奇怪的行爲。有時候最好的選擇是再次從頭開始配置所有的東西。例如,我不能在調試時使用一些編解碼器 - 如果我在調試模式下運行程序,但沒有調試一切都很好,但如果我嘗試調試 - 來自文件的每個幀都是空的(但其大小是正確的)。 你可能剛剛遇到了一些類似的東西。嘗試將圖像轉換爲不同的格式(我認爲bmp是測試的最佳選擇 - 它應該始終工作,沒有任何額外的庫)。

  3. 另外請注意,您已經上傳jpg文件,所以我不得不重新命名並自行將其轉換 - 也許在轉換過程中,此文件中的某些內容已更改,因此我們沒有在完全相同的文件上測試您的代碼 - 上傳您png Dropbox上的文件,所以我可以測試它。

+0

謝謝你爲我着想。不幸的是,我目前無法訪問Dropbox,因此無法測試您的項目或上傳更多文件,但我可以確認我確實仍然有同樣的問題。我使用CMake來生成這個項目,所以也許在那裏有一個我錯過的選項。我現在已經從我的項目中省略了Haar級聯,並將在稍後的日期回到調查中。 – Chris

2

看到這個post: 這種類型的錯誤可能是由於在發佈模式下鏈接到opencv的調試庫引起的。

+0

我讀過,但我沒有任何問題加載XML文件,或運行代碼,它只是輸出是不同的。此外,正在加載正確的OpenCV dll - 調試調試,發佈版本。 – Chris

相關問題