Я пытаюсь получить простой образец OpenCV работа в C ++ на Windows и мой C ++ более чем ржавые.
Пример довольно просто:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
if( argc != 2)
{
cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
return -1;
}
Mat image;
image = imread(argv[1], IMREAD_COLOR); // Read the file
if(! image.data ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
Когда я делаю новое простое консольное приложение C ++ (с ATL) в Visual Studio 2012, я получаю другой шаблон для main
:
int _tmain( int argc, _TCHAR* argv[] )
Поэтому, прежде чем я отправлю имя файла в OpenCV imread
функция мне нужно преобразовать _TCHAR*
arg[1]
к char*
, Используя простое имя файла ‘opencv-logo.jpg’, из памяти в окне памяти я вижу, что _TCHAR занимает по два байта каждый
o.p.e.n.c.v.-.l.o.g.o...j.p.g...
6f 00 70 00 65 00 6e 00 63 00 76 00 2d 00 6c 00 6f 00 67 00 6f 00 2e 00 6a 00 70 00 67 00 00 00
Следуя рекомендации по конверсии в другой ответ Я пытаюсь использовать ATL 7.0 Классы преобразования строк и макросы вставив следующий код:
char* filename = CT2A(argv[1]);
Но получающаяся память — беспорядок, конечно не ‘opencv-logo.jpg’ как строка ascii:
fe fe fe fe fe fe fe fe fe fe ...
þþþþþþþþþþ ...
Какой метод преобразования, функцию или макрос я должен использовать?
(Нотабене это может быть связанный вопрос, но я не вижу, как подать заявку ответ Вот.)
Самое быстрое решение — просто поменять подпись на стандартную. Заменить:
int _tmain( int argc, _TCHAR* argv[] )
С
int main( int argc, char *argv[] )
Это означает, что в Windows аргументы командной строки преобразуются в кодировку локали системы, и поскольку Windows здесь не поддерживает UTF-8, не все конвертируется правильно. Однако если вам действительно не нужна интернационализация, то, возможно, вам не стоит тратить время на что-то еще.
_TCHAR
т.е. TCHAR
это тип, который зависит от настроек вашего проекта. Это может быть либо wchar_t
(когда вы используете Unicode) или char
(когда вы используете многобайтовый). Вы найдете это в Свойства проекта — генеральный, есть настройка Набор символов.
Вероятно, самая простая вещь, которую вы могли бы сделать, это просто использовать многобайтовую опцию и обрабатывать _TCHAR*
введите как простой char*
и использовать его для построения std::string
объект как можно скорее:
std::string filename(argv[1]);
Но если вы собираетесь работать со специальными символами A LOT, то я считаю более разумным использовать Unicode и хранить строки в форме std::wstring
объекты везде, где это возможно. Если это так, то просто используйте std::wstring
вместо конструктора:
std::wstring filename(argv[1]);
И в случае, если вы в конечном итоге будете работать с широкими строками, иногда вам потребуется преобразование между широкими строками и многобайтовыми строками, и эти помощники могут помочь вам:
// multi byte to wide char:
std::wstring s2ws(const std::string& str)
{
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
// wide char to multi byte:
std::string ws2s(const std::wstring& wstr)
{
int size_needed = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), int(wstr.length() + 1), 0, 0, 0, 0);
std::string strTo(size_needed, 0);
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), int(wstr.length() + 1), &strTo[0], size_needed, 0, 0);
return strTo;
}
кроме чтения 26-страничного руководства по cpp 2003 VS, которое не сильно изменилось …. std :: string test (print);
test = «»;
int _tmain( int argc, _TCHAR* argv[] )
int main( int argc, char *argv[] )
работают так же, если вы не используете какую-то функцию безопасности …. и не можете быть в кодировке Unicode в свойстве набора символов … если бы вы использовали функцию CreateFile в функциях управления файлами, если вы не каким-то образом многопоточны