1. 程式人生 > >opencv程式除錯問題及解決方案1

opencv程式除錯問題及解決方案1

本人很菜,也沒怎麼學習過C++,opencv程式執行時經常出錯,所以把問題和解決方案都記下來以免再犯。

OpenCV的feature2d module中提供了從區域性影象特徵(Local image feature)的檢測、特徵向量(feature vector)的提取,到特徵匹配的實現。其中的區域性影象特徵包括了常用的幾種區域性影象特徵檢測與描述運算元,如FAST、SURF、SIFT、以及ORB。對於高維特徵向量之間的匹配,opencv主要有兩種方式:1)BruteForce窮舉法;2)FLANN近似K近鄰演算法(包含了多種高維特徵向量匹配的演算法,例如隨機森林等)。

opencv特徵檢測和匹配程式執行常見錯誤及解決方法

1)使用特徵點檢測需要增加使用一下兩個標頭檔案:
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"

2)Vector容器使用時報錯:程式碼中顯示缺少類模板“std::vector”的引數列表

解決方案:可以看標頭檔案中類的定義,

正確使用:

std::vector<DMatch> matches;

std::vector<KeyPoint> queryKeypoints, trainKeypoints;

std::vector<vector<DMatch>> knnmatches;

initModule_nonfree();//報錯,標頭檔案加#include "opencv2/nonfree/nonfree.hpp"解決

3)Error1error C1075: end of file found before the left brace '{' at 'd:\program files (x86)\opencv2_4_13\projectopencv2413\featuredetectedandmatch\feature2d\feature2d\source.cpp(27)' was matched

原因:缺少"}",是括號不匹配的問題或

某些特殊的轉義字元多寫了。

4)main函式的引數列表儲存了輸入引數的資訊,第一個引數argc記錄了輸入引數的個數, 
 第二個引數是字串陣列的,字串陣列的每個單元是char*型別的,指向一個c風格字串。 
 以notepad.exe  example.txt為例 
 argc是2,就是說argv陣列中有兩個有效單元 
 第一單元指向的字串是"notepad.exe" 
 第二單元指向的字串是"example.txt" 

 argv陣列中的第一個單元指向的字串總是可執行程式的名字,以後的單元指向的字串依次是程式呼叫時的引數。 
 這個賦值過程是編譯器完成的,我們只需要讀出資料就可以了。


int  main(  int  argc  ,  char  *argv[]  ,  char  *envp[]  ) 
 main()函式一般用int或者void形的。我比較喜歡用int型定義main。因為在結束的時候可以返回給作業系統一個值以表示執行情況。 

 int  argc 
 這個東東用來表示你在命令列下輸入命令的時候,一共有多少個引數。比方說你的程式編譯後,可執行檔案是test.exe 
 D:\tc2>test 
 這個時候,argc的值是1 
 但是 
 D:\tc2>test.exe  myarg1  myarg2 
 的話,argc的值是3。也就是  命令名  加上兩個引數,一共三個引數 

 char  *argv[] 
 這個東東用來取得你所輸入的引數 
 D:\tc2>test 
 這個時候,argc的值是1,argv[0]的值是  "test" 
 D:\tc2>test  myarg1  myarg2 
 這個時候,argc的值是3,argc[0]的值是"test",argc[1]的值是"myarg1",argc[2]的值是"myarg2"。 
 這個東東一般用來為程式提供非常重要的資訊,如:資料檔名,等等。 
 如:copy  a.c  b.txt 
 這個時候,a.c和b.txt就是所謂的“非常重要的資訊”。不指定這兩個檔案,你沒法進行拷貝。 
 當你的程式用到argc和argv這兩個引數的時候,可以簡單地通過判斷argc的值,來看看程式的引數是否符合要求 

 char  *envp[] 
 這個東東相對來說用得比較少。它是用來取得系統的環境變數的。 
 如:在DOS下,有一個PATH變數。當你在DOS提示符下輸入一個命令(當然,這個命令不是dir一類的內部命令)的時候,DOS會首先在當前目錄下找這個命令的執行檔案。如果找不到,則到PATH定義的路徑下去找,找到則執行,找不到返回Bad  command  or  file  name 
 在DOS命令提示符下鍵入set可檢視系統的環境變數 
 同樣,在UNIX或者LINUX下,也有系統環境變數,而且用得比DOS要多。如常用的$PATH,$USER,$HOME等等。 
 envp儲存所有的環境變數。其格式為(UNIX下) 
 PATH=/usr/bin;/local/bin; 
 HOME=/home/shuui 
 即: 
 環境變數名=值 
 DOS下大概也一樣。 
 環境變數一般用來為程式提供附加資訊。如,你做了一個顯示文字的內容的程式。你想控制其一行中顯示的字元的個數。你可以自己定義一個環境變數(UNIX下) 
 %setenv  NUMBER  =  10 
 %echo  $NUMBER 
 10 
 然後你可以在程式中讀入這個環境變數。然後根據其值決定一行輸出多少個字元。這樣,如果你不修改環境變數的話,你每次執行這個程式,一行中顯示的字元數都是不一樣的 
 下面是一個例子程式 


 #include<stdio.h> 
 int main(  int  argc  ,  char  *argv[]  ,  char