2017-01-22 99 views
-2

我已經編寫了用於在C++中顯示圖像的代碼。使用C++顯示圖像

#include <opencv2/core/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <string> 

using namespace std; 
using namespace cv; 

int main(int x,char*y) 
{ 
    string Image_Name = y[1]; 


    Mat image=imread(Image_Name); 


    if (image.empty()) 
    { 
     cout << "This is invalid input" << endl; 
     return -1; 
    } 

    namedWindow("Lenna", WINDOW_NORMAL); 

    imshow("Lenna",image); 

    waitKey(0); 

    return 0; 

} 

當我嘗試運行它,編譯器顯示我這些錯誤:

「嚴重性代碼說明項目文件行 錯誤C2440‘初始化’:無法從‘字符’轉換成 「STD :: basic_string的,標準::分配器>」 OpencvTest E:\編程示出圖像 ç\ \ opencvtest \ source.cpp 12「

和:

「嚴重性代碼描述項目文件行錯誤(活性)沒有 合適構造的存在是爲了從轉換 「CHAR」 到 「的std :: basic_string的, 的std ::分配器>」 OpencvTest E:\編程C本\顯示一個 image \ OpencvTest \ Source.cpp 12「

任何人都可以幫我解決這個錯誤嗎?

回答

1

小的失誤:

int main(int x,char*y) 

應改爲

int main(int x, char*y[]) 

int main(int x, char **y) 

沒有構造從charstd::string的確轉換,只能從char*char和一個intege r計數。

請參閱http://en.cppreference.com/w/cpp/language/main_functionhttp://en.cppreference.com/w/cpp/string/basic_string/basic_string以供參考。

另外,這兩個參數有標準名稱:argc - 參數計數和argv - 參數值。更好地堅持標準。

您還需要檢查argc是否等於2,否則沒有第二個參數可供讀取。

編輯:更有意義的是檢查argc >= 2而不是嚴格的argc == 2,在這種情況下,程序將忽略第二個參數後面的參數。

+0

謝謝你的回答。我的答案只有一個問題:爲什麼我應該檢查「argc」是否等於2?因爲如果我沒有使用循環檢查,因此沒有問題,我的代碼,它運行成功。 –

+0

如果通常稱爲「語句」,因爲它不會重複發生,與循環相反。檢查'argc == 2'的目的是確保有兩個參數:第一個參數總是可執行文件的名稱(例如「a.out」或「main.exe」 - 我不知道Visual Studio的名稱生成的可執行文件),第二個參數是圖像名稱。如果參數較少,那麼程序仍然會讀取argv [1]中的數據,但這會變成垃圾,或者可能導致程序崩潰,導致訪問超出界限。 – iksemyonov