2013-10-17 81 views
1

即時閱讀的文本框的路徑,然後試圖打開圖像轉換^爲char *的WinForms C++

String^ P = path->Text; 

IplImage* img = cvLoadImage(P); 

它給了我下面的錯誤

Error 1 error C2664: 'cvLoadImage' : cannot convert parameter 1 from 'System::String ^' to 'const char *' 

誰能告訴我如何轉換它char *。

+1

可能的重複[如何將系統::字符串^轉換爲常量字符\ *?](http://stackoverflow.com/questions/1098431/how-do-i-convert-a-systemstring-to-const- char) – shf301

+0

首先,你必須知道哪個字符集d編碼你想轉換。您可能希望使用線程的當前「代碼頁」,該代碼頁取決於線程調用的或從其父線程繼承的OS設置,用戶設置和API函數而有所不同。另一種選擇是UTF-8。它廣泛用於Internet和其他操作系統,並且是許多.NET文件功能所使用的默認字符集/編碼。很明顯,因爲你將它傳遞給一個庫函數,所以你需要確保庫可以接受你傳遞的信息。 –

+0

其次,您必須知道本地字符串的生命週期和所有權傳遞的要求。我的猜測是,它可以在塊的末尾被銷燬。如果是這樣,您可以使用自動執行此操作的轉換,否則@ user2740528會在[answer](http://stackoverflow.com/a/19474411/2226988)中省略FreeHGlobal(由@Hans指出) –

回答

0
System::String^str = path->Text ; 
char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer(); 
printf(str2); 

包括以下的頭文件

#using <mscorlib.dll> 
using namespace System::Runtime::InteropServices; 
+2

忽略所需的Marshal :: FreeHGlobal()調用是個不錯的主意。 –

0

它是永遠不會太晚。

這裏是我使用

而且不要忘記,包括基本的文件的#include「saveImg.h」 調用這個頭文件由

saveImg()代碼;

saveImg.h

int saveImg(){ // int argc , char* argv[]) { // (int argc, char** argv) { 
    IplImage* img; 
    // if(argc == 2 && (img=cvLoadImage(argv[1], 1))!= 0)  { 
    img=cvLoadImage("hello.jpg") ; 
     IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1); 
     IplImage* net1 = cvCreateImage(cvGetSize(img), 8, 3); 
     CvMemStorage* storage = cvCreateMemStorage(0); 
     cvCvtColor(img, gray, CV_BGR2GRAY); 
     cvSmooth(gray, gray, CV_GAUSSIAN, 9, 9); // smooth it, otherwise a lot of false circles may be detected 
     CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100); 
     int i; 
     for(i = 0; i < circles->total; i++)   { 
      float* p = (float*)cvGetSeqElem(circles, i); 
      cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0); 
      cvCircle(img, cvPoint(cvRound(p[1]),cvRound(p[2])), cvRound(p[3]), CV_RGB(50,0,100), 3, 8, 0); 
//      cvWaitKey(0); 
     } 
     cvNamedWindow("Original", 1); 
     cvShowImage("Original", img); 
     cvWaitKey(0); 

     cvNamedWindow("circles", 1); 
     cvShowImage("circles", gray); 
     cvWaitKey(0); 
    return 0; 
} 
0

字符*爲字符串^在Visual Studio C++ 10和上述

我測試這一點,並行,同時使小計算器....

// Variables : 

char * number1 ; 
double num1 ; 
String^no1 ; 


    number1 = (char*)Marshal::StringToHGlobalAnsi(no1).ToPointer(); num1 = atof (number1) ; 
+0

這不是user2740528的答案嗎?唯一的區別是你將字符串解釋爲浮點數,這與問題無關。 –