2016-07-20 20 views
2

Ich rufe meine eigene definierte Funktion, in der ich die std :: string als Argument dieser Funktion übergeben. Ich muss auch eingeben cv :: Mat cv :: imread (const cv :: String & Dateiname, int Flags = 1); Und ich kann keine Argumente als cv :: String angeben.Wie konvertiert man std :: string in CV :: String in C++?

Also muss ich konvertieren std :: string in cv :: String sowieso.

Update:

Ich habe oben beschriebene Funktion in einer nicht verwalteten DLL verpackt und es von einer C# Konsolenanwendung aufrufen, so dass es mir schlecht Speicherzuweisung gibt.

Ich habe versucht, std :: string in cv :: String-Konstruktor zu werfen, aber es hat nicht funktioniert.

Unmanaged C++ Code (erstellt DLL in Visual Studio 2013)

MathFunc.h

#include <stdexcept> 
using namespace std; 

namespace MathFunc 
{ 
    extern "C" { __declspec(dllexport) double DoSomething(std::string imgPath); } 

} 

Mathfunc.cpp

#include <iostream> 
#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/core/cvstd.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "MathFuncDll.h" 

using namespace std; 
using namespace cv; 

namespace MathFunc 
{ 
    double DoSomething(std::string imgPath) 
    { 
    try{ 
     cv::Mat image; 
     image = cv::imread(imgPath); 
    }catch (exception &e){ 
     cout << "Error Occurred"<< e.what() << endl; 
    } 
    return 0; 
    } 
} 

Das i Ich s die Fehlermeldung erhalten, wenn mit:

OpenCV Error: Insufficient memory (Failed to allocate 1345270332 bytes) in cv::OutOfMemoryError, 
file C:\opencv\sources\modules\core\src\alloc.cpp, line 52 

So ist die Zeichenfolge an diese Funktion übergeben wird, von 1345270325 characters long

Wenn ich Bildpfad als image = cv::imread("C:/path_to_images/input_image.jpg"); geben, es funktioniert gut. Kein Fehler auftritt.

Kann jemand das korrigieren?

+3

Versuchen Sie, 'c_str()' von 'std :: string' als Argument zu übergeben. – Arunmu

+0

oder Sie könnten es umwandeln http://docs.opencv.org/3.1.0/d1/d8f/classcv_1_1String.html#a8bbd0cc5d752437758918151afd9bb82 – slawekwin

+0

Wenn Sie sagen "Ich kann keine Argumente als cv :: String geben." Was passiert, wenn Sie das Argument übergeben (und den Compiler konvertieren lassen)? Welche Fehlermeldung erhalten Sie? –

Antwort

3

Nach dem document schreiben, hat cv::String einen Konstruktor ein std::string als Parameter genommen wird, was bedeutet, std::string implizit cv::String umgewandelt werden könnte.

+0

Ich habe meine Frage mit Code aktualisiert, den ich ausprobiert habe. Schauen Sie bitte – Mavie

2

Was ist das Problem bei der direkten Verwendung eines std::string?

imread gut für mich funktioniert, wenn ich etwas entlang der Linien von

std::string filename = "Path/to/img.jpg"; 
cv::Mat img = cv::imread(filename); 
Verwandte Themen