How to use cv::imread for non-ASCII file names?
چگونه از imread برای نام فایلهای غیراسکی استفاده کنیم؟
یکی از مشکلات نسخه های فعلی OpenCV این است که امکان خواندن از مسیر یونیکد وجود ندارد و اگر مثلا در مسیر فایل یا نام فایل، حروف فارسی وجود داشته باشد، امکان خواندن تصویر وجود ندارد. راه حلی که من استفاده کردم و جواب می دهد قطعه کد زیر است که ابتدا فایل را به صورت یک فایل باینری توسط توابع استاندارد C++ می خوانیم سپس با تابع imdecode بافر حافظه را تبدیل به cv::Mat می کنیم:
cv::Mat ReadImage(const wchar_t* filename) { FILE* fp = _wfopen(filename, L"rb"); if (!fp) { return Mat::zeros(1, 1, CV_8U); } fseek(fp, 0, SEEK_END); long sz = ftell(fp); char* buf = new char[sz]; fseek(fp, 0, SEEK_SET); long n = fread(buf, 1, sz, fp); _InputArray arr(buf, sz); Mat img = imdecode(arr, CV_LOAD_IMAGE_COLOR); delete[] buf; fclose(fp); return img; }