0

请在下面opencv代码C#字符串VS STD:字符串:问题在传球串

void ImageWriter::writeImage(Mat image) 
{ 
    number++; 
    String name="D:/OpenCV Final Year/Images/intruder"; 
    name+=number; 
    name+=".bmp"; 

    //imwrite("D:/OpenCV Final Year/Images/intruder.bmp",image); 
    imwrite(name,image); 
} 

这里看看,我能说的是,imwrite()没有写任何东西!没有错误但没有输出。如果我使用imwrite()的注释版本,则按预期工作。但我无法使用它,因为我需要编写一些图像,所以名称更改由number整数变量完成很重要。我相信问题是name字符串。

但是,这name是在C#类型,这是因为std:string冲突。

我该如何使这个动态名称创建成功并使imwrite()正常工作?

+2

你是什么意思“'的std :: string'冲突”? [这个问题](http://stackoverflow.com/q/1300718/1601291)解决了这两种类型之间的转换。 – Aurelius

+0

@Aurelius:请原谅我延迟回复。对于std:string,它会产生错误 –

+0

什么样的错误?编译错误?运行时错误?他们说什么? – Aurelius

回答

1

只是想法 你试过:

  1. 使用字符数组? (char[]
  2. StringStream
  3. 字符串格式,而不是+=
1

它不工作,因为你正试图String对象传递一个托管的.NET系统:给需要一个std功能: :串。看看这里的文档(OpenCV Documents C++ imwrite)它会显示它期待一个常量字符串&类型。

如果你正在用C#写这个,没有办法能够'声明'一个std :: string对象。

我会先看看是否name.ToCharArray()会工作。尽管这会生成一个托管数组,但编译器可能会计算出从托管字符数组到本机所需的转换。

当您使用C++/CLI中,您需要将您的托管字符串封送到STD格式:

#include <string> 
using namespace std; 
using namespace System; 

void MarshalString (String^ s, string& os) 
{ 
    using namespace Runtime::InteropServices; 
    const char* chars = 
     (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); 
    os = chars; 
    Marshal::FreeHGlobal(IntPtr((void*)chars)); 
} 

void ImageWriter::writeImage(Mat image) 
{ 
    number++; 
    String name="D:/OpenCV Final Year/Images/intruder"; 
    name+=number; 
    name+=".bmp"; 

    string nativeString; 
    MarshalString(name, nativeString); 

    imwrite(nativeString, image); 
} 
+0

感谢您的答复。我正在用C++/CLI编写\ –