1. 程式人生 > >OpenCV中gpu下使用cascade classifier遇到問題的解決方案

OpenCV中gpu下使用cascade classifier遇到問題的解決方案

        在使用opencv gpu模組下的CascadeClassifier_GPU時,遇到了幾個當時很難理解,網上也找不到答案的問題。最近空閒下來,翻了opencv的原始碼,找到了問題所在。寫出來希望能讓遇到同樣問題的人少走彎路~

        先交代下環境:VS2013+opencv2.4.11

問題1:用haar training訓練出分類器,但是gpu調用出現下面的錯誤:

        OpenCV Error: Gpu API call (NCV Assertion Failed: retcode=26, file=opencv-2.4.11/modules/gpu/src/nvidia/NCVHaarObjectDetection.cu, line=1589


解決:這是因為在訓練的時候,haar 特徵選取了45度特徵導致的。

過程:程式執行中斷之後,一步一步的查為什麼中斷


可以看到,是由於haar.bNeedsTiltedII == false引起了中斷,然後查詢在哪裡給haar.bNeedsTiltedII賦值了。分析了xml檔案在cpu和gpu中的載入程式碼,找到了NCVStatus loadFromXML(const std::string &filename,HaarClassifierCascadeDescriptor &haar, std::vector<HaarStage64> &haarStages, std::vector<HaarClassifierNode128> &haarClassifierNodes,std::vector<HaarFeature64> &haarFeatures)函式,裡面有一句對haar.bNeedsTiltedII的更新:


feature是這樣子的: CvHaarFeature* feature = &tree->haar_feature[n];所以就可以找到CvHaarFeature結構裡面tilted的定義。然後,這個變數的定義居然沒有註釋,最後在另外一個部落格中找到了定義,引數titled,0表示該特徵是標準的haar-like特徵,1表示旋轉45°後的特徵。

部落格地址:http://www.cnblogs.com/pakfahome/p/3611303.html

然後我猛然發現,我自己訓練的時候,指定的-mode 是ALL......

        問題2:直接把samples/gpu路徑下面的cascadeclassifier.cpp檔案複製出來,編譯執行,使用data下面的haarcascade_frontalface_alt.xml,結果出現下面的錯誤:

        OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in cvRead, file ******(此處是路徑)persistence.cpp, line 5008

解決:如果想用opencv自帶的那些xml,去下載2.4.13,裡面的data資料夾,有一個叫做gpu的資料夾,專門有給gpu 用的xml檔案,2.4.11裡面沒有。

過程:當時實在是不知道為什麼,同樣的資料集,用cpu載入沒有問題,怎麼到了gpu下面就出錯了呢?看了opencv的幫助

上面說gpu只支援haar training訓練出來的分類器,由於當時我需要使用自己訓練的xml,所以這個錯誤也沒在意,後續解決也是巧合,偶然看2.4.13的data資料夾,發現裡面有一個叫做gpu的資料夾,專門有給gpu 用的資料。