9 #include "opencv2/opencv.hpp"
11 #if (defined(_MSC_VER) && _MSC_VER < 1900)
13 #elif (defined(_MSC_VER) && _MSC_VER <= 1916)
15 namespace fs = std::experimental::filesystem;
16 #elif ((defined(_MSC_VER) && _MSC_VER > 1916) || __cplusplus >= 201703L)
18 namespace fs = std::filesystem;
24 ImageFilePathMultiByteChar,
25 ImageFilePathWideChar,
38 int depth = image.depth();
68 assert(
false &&
"saige: unsupported image depth");
70 if(min != max) image.convertTo(image, CV_8U, 255.0 / (max - min), -255.0 * min / (max - min));
74 bool OpenImageFile(
const std::wstring imagePath, cv::Mat& image,
bool asCV8U =
false)
76 const wchar_t* imageFilePath = imagePath.c_str();
78 size_t sizeOfChar = 0;
80 size_t sizeOfWChar = wcslen(imageFilePath);
81 size_t bufferSize = sizeOfWChar * 2;
83 std::vector<char> imageFilePathMB(bufferSize);
85 sizeOfChar = wcstombs(
86 imageFilePathMB.data(),
93 if (sizeOfChar != sizeOfWChar)
95 #if ((defined(_MSC_VER) && _MSC_VER >= 1900) || __cplusplus >= 201402L)
96 std::ifstream ifs(fs::path(imageFilePath), std::ios::in | std::ios::ate | std::ios::binary);
99 size_t size = ifs.tellg();
101 ifs.seekg(0, std::ios::beg);
102 std::vector<uchar> buffer(size);
103 ifs.read(
reinterpret_cast<char*
>(&buffer[0]), size);
106 image = cv::imdecode(buffer, cv::IMREAD_UNCHANGED);
119 image = cv::imread(imageFilePathMB.data(), cv::IMREAD_UNCHANGED);
122 if (image.empty() ==
true)
140 if (inputType == eSRInputImageType::ImageFilePathMultiByteChar || inputType == eSRInputImageType::ImageFilePathWideChar)
149 if ((image.empty() ==
true) || (isOpened ==
false))
151 std::wcout <<
"GetImageDataByInputImageType: wrong file path or damaged file.." << imagePath << std::endl;
155 width = image.size().width;
156 height = image.size().height;
157 int c = image.channels();
159 unsigned char* ucData =
nullptr;
161 bool bIsColor =
false;
166 case eSRInputImageType::ImageFilePathMultiByteChar:
167 case eSRInputImageType::ImageFilePathWideChar:
169 case eSRInputImageType::UCGrayImage:
170 ucData =
new unsigned char[width * height * 1];
173 cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
177 cv::cvtColor(image, image, cv::COLOR_BGRA2GRAY);
179 memcpy(ucData, image.data,
sizeof(
unsigned char) * width * height * 1);
181 case eSRInputImageType::UCColorImage:
182 ucData =
new unsigned char[width * height * 3];
185 cv::cvtColor(image, image, cv::COLOR_BGRA2BGR);
187 bIsColor = (c == 1) ? 0 : 1;
191 memcpy(ucData, image.data,
sizeof(
unsigned char) * width * height * 3);
195 for (
int i = 0; i < width * height; i++)
197 ucData[3 * i + 0] = image.data[c * i + 0 * bIsColor];
198 ucData[3 * i + 1] = image.data[c * i + 1 * bIsColor];
199 ucData[3 * i + 2] = image.data[c * i + 2 * bIsColor];
203 case eSRInputImageType::UIColorImage:
204 bIsColor = (c == 1) ? 0 : 1;
205 ucData =
new unsigned char[width * height * 4];
206 for (
int i = 0; i < width * height; i++)
208 ucData[4 * i + 0] = image.data[c * i + 0 * bIsColor];
209 ucData[4 * i + 1] = image.data[c * i + 1 * bIsColor];
210 ucData[4 * i + 2] = image.data[c * i + 2 * bIsColor];
213 ucData[4 * i + 3] = image.data[c * i + 3 * bIsColor];
217 ucData[4 * i + 3] = 255;
221 case eSRInputImageType::UCGrayImage16Bit:
222 ucData =
new unsigned char[width * height * 1 * 2];
225 cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
229 cv::cvtColor(image, image, cv::COLOR_BGRA2GRAY);
231 memcpy(ucData, image.data,
sizeof(
unsigned char) * width * height * 1 * 2);
233 case eSRInputImageType::UCColorImage16Bit:
234 ucData =
new unsigned char[width * height * 3 * 2];
237 cv::cvtColor(image, image, cv::COLOR_GRAY2BGR);
241 cv::cvtColor(image, image, cv::COLOR_BGRA2BGR);
243 memcpy(ucData, image.data,
sizeof(
unsigned char) * width * height * 3 * 2);
245 case eSRInputImageType::UIColorImage16Bit:
246 ucData =
new unsigned char[width * height * 4 * 2];
249 cv::cvtColor(image, image, cv::COLOR_GRAY2BGRA);
253 cv::cvtColor(image, image, cv::COLOR_BGR2BGRA);
255 memcpy(ucData, image.data,
sizeof(
unsigned char) * width * height * 4 * 2);
257 case eSRInputImageType::UC8bitImage:
258 ucData =
new unsigned char[width * height * image.channels()];
259 memcpy(ucData, image.data,
sizeof(
unsigned char) * width * height * image.channels());
265 if (channel !=
nullptr) {
266 *channel = image.channels();
269 return (
void*)ucData;
275 cv::Mat failImage = cv::Mat();
279 if ((failImage.empty() ==
true) || (isOpened ==
false))
284 if (failImage.channels() == 1)
286 cv::cvtColor(failImage, failImage, cv::COLOR_GRAY2BGR);
288 else if (failImage.channels() == 4)
290 cv::cvtColor(failImage, failImage, cv::COLOR_BGRA2BGR);
293 cv::putText(failImage, failPhrase,
295 cv::FONT_HERSHEY_COMPLEX_SMALL,
297 cv::Scalar(0, 0, 255),
301 cv::putText(failImage, failPhrase,
302 cv::Point(
int(failImage.size().width * 0.25),
int(failImage.size().height * 0.25)),
303 cv::FONT_HERSHEY_COMPLEX_SMALL,
305 cv::Scalar(0, 0, 255),
309 cv::putText(failImage, failPhrase,
310 cv::Point(
int(failImage.size().width * 0.5),
int(failImage.size().height * 0.5)),
311 cv::FONT_HERSHEY_COMPLEX_SMALL,
313 cv::Scalar(0, 0, 255),
317 cv::putText(failImage, failPhrase,
318 cv::Point(
int(failImage.size().width * 0.75),
int(failImage.size().height * 0.75)),
319 cv::FONT_HERSHEY_COMPLEX_SMALL,
321 cv::Scalar(0, 0, 255),
325 cv::namedWindow(windowName, cv::WINDOW_NORMAL);
326 cv::resizeWindow(windowName, failImage.size().width * resizeFactor, failImage.size().height * resizeFactor);
327 cv::imshow(windowName, failImage);
328 cv::waitKey(displayTime);
337 contours.resize(
object.nContours);
340 hierarchies.resize(
object.nContours);
343 for (
size_t i_c = 0; i_c < contours.size(); i_c++)
345 for (
size_t i_p = 0; i_p <
object.nPointsOnContour[i_c]; i_p++)
347 cv::Point point = cv::Point(
object.pointsOnContour[pointsIdx],
object.pointsOnContour[pointsIdx + 1]);
348 contours[i_c].push_back(point);
353 hierarchies[i_c][0] =
object.hierarchies[4 * i_c + 0];
354 hierarchies[i_c][1] =
object.hierarchies[4 * i_c + 1];
355 hierarchies[i_c][2] =
object.hierarchies[4 * i_c + 2];
356 hierarchies[i_c][3] =
object.hierarchies[4 * i_c + 3];