0

请看下面的opencv代码

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冲突。

我怎样才能使这个动态名称创建成功并使 get theimwrite()工作?

4

2 回答 2

1

只是想法您是否尝试过:

  1. 使用字符数组?( char[])
  2. StringStream
  3. 字符串格式而不是+=
于 2013-07-24T18:34:38.260 回答
1

它不起作用,因为您试图将托管的 .NET System::String 对象传递给需要 std::string 的函数。查看此处的文档(OpenCV Documents C++ imwrite),它似乎需要一个 const string& 类型。

如果您在 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);
}
于 2013-07-26T17:47:29.263 回答