2016-07-20 2 views
2

Я вызываю свою собственную определенную функцию, в которой передаю std :: string в качестве аргумента этой функции. Мне также нужно указать ввод cv :: Mat cv :: imread (const cv :: String & filename, int flags = 1); И я не могу дать аргументы как cv :: String.Как преобразовать std :: string в CV :: String в C++?

Так что мне нужно конвертировать std :: string в cv :: String в любом случае.

Update:

Я упакована выше описанной функции в неуправляемый DLL и вызова из приложения C# консоли, так что это дает мне плохое распределение памяти.

Я попытался наложить std :: string в cv :: String конструктор, но это не сработало.

Неуправляемый C++ код (созданный DLL в 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; 
    } 
} 

Это я S ошибка я получаю при использовании:

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

Так строка передается этой функции имеет 1345270325 characters long

Когда я даю путь к изображению, как image = cv::imread("C:/path_to_images/input_image.jpg");, он отлично работает. Ошибка не возникает.

Кто-нибудь знает, как исправить это?

+3

Попробуйте передать 'c_str()' из 'std :: string' в качестве аргумента. – Arunmu

+0

или вы могли бы наложить его http://docs.opencv.org/3.1.0/d1/d8f/classcv_1_1String.html#a8bbd0cc5d752437758918151afd9bb82 – slawekwin

+0

Когда вы говорите: «Я не могу давать аргументы как cv :: String». что происходит, когда вы передаете аргумент (и пусть конвертер компилятора)? Какое сообщение об ошибке вы получите. –

ответ

3

Согласно document, cv::String имеет конструктор, принимающий один std::string в качестве параметра, что означает std::string может быть неявно преобразован в cv::String.

+0

Я обновил свой вопрос кодом, который я пробовал. Пожалуйста, посмотрите – Mavie

2

В чем проблема с использованием std::string?

imread отлично работает для меня, когда я пишу что-то вдоль линий

std::string filename = "Path/to/img.jpg"; 
cv::Mat img = cv::imread(filename); 
Смежные вопросы