diff --git a/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp b/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp index 69db8f7..ba0d669 100644 --- a/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp +++ b/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp @@ -5,23 +5,37 @@ using namespace openalprnet; BitmapMat::BitmapMat(array^ byteArray) { - this->m_bitmap = ByteArrayToMat(byteArray); + m_bitmap = new cv::Mat(); + std::vector buffer = AlprHelper::ToVector(byteArray); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); } BitmapMat::BitmapMat(Bitmap^ bitmap) { - this->m_bitmap = BitmapToMat(bitmap); + m_bitmap = new cv::Mat(); + + MemoryStream^ ms = gcnew MemoryStream(); + bitmap->Save(ms, ImageFormat::Png); + + std::vector buffer = AlprHelper::ToVector(ms->ToArray()); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); + + delete ms; } BitmapMat::BitmapMat(MemoryStream^ memoryStream) { - this->m_bitmap = MemoryStreamBitmapToMat(memoryStream); + m_bitmap = new cv::Mat(); + std::vector buffer = AlprHelper::ToVector(memoryStream->ToArray()); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); } BitmapMat::BitmapMat(String^ filename) { - Bitmap^ bitmap = gcnew Bitmap(filename); - this->m_bitmap = BitmapToMat(bitmap); - delete bitmap; + m_bitmap = new cv::Mat(); + array^ byteArray = File::ReadAllBytes(filename); + std::vector buffer = AlprHelper::ToVector(byteArray); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); + delete byteArray; } diff --git a/src/bindings/csharp/openalpr-net/bitmapmat-net.h b/src/bindings/csharp/openalpr-net/bitmapmat-net.h index cedbf94..3732759 100644 --- a/src/bindings/csharp/openalpr-net/bitmapmat-net.h +++ b/src/bindings/csharp/openalpr-net/bitmapmat-net.h @@ -1,6 +1,9 @@ #pragma once -#include "opencv2/imgproc/imgproc.hpp" +#include +#include + +#include "helper-net.h" using namespace System; using namespace System::Drawing; @@ -33,74 +36,16 @@ namespace openalprnet { !BitmapMat() { - delete[] m_bitmap->data; + m_bitmap->release(); + delete m_bitmap; } property cv::Mat Value { cv::Mat get() { - cv::Mat value = this->m_bitmap->clone(); - return value; + return *m_bitmap; } } - private: - - static cv::Mat* BitmapToMat(Bitmap^ bitmap) - { - int channels = 0; - - switch (bitmap->PixelFormat) - { - case PixelFormat::Format8bppIndexed: - case PixelFormat::Format1bppIndexed: - channels = 1; - break; - case PixelFormat::Format24bppRgb: - channels = 3; - break; - case PixelFormat::Format32bppRgb: - case PixelFormat::Format32bppArgb: - case PixelFormat::Format32bppPArgb: - channels = 4; - break; - default: - throw gcnew NotSupportedException(bitmap->PixelFormat.ToString()); - } - - BitmapData^ bitmapData = bitmap->LockBits( - System::Drawing::Rectangle(0, 0, bitmap->Width, bitmap->Height), - ImageLockMode::ReadOnly, - bitmap->PixelFormat - ); - - const int totalBytes = bitmap->Height * bitmapData->Stride; - - char *dst = new char[totalBytes]; - ::memcpy(dst, bitmapData->Scan0.ToPointer(), totalBytes); - - cv::Mat* dstMat = new cv::Mat(cv::Size(bitmap->Width, bitmap->Height), CV_8UC(channels), dst); - - bitmap->UnlockBits(bitmapData); - - return dstMat; - } - - static cv::Mat* MemoryStreamBitmapToMat(MemoryStream^ memoryStream) - { - Bitmap^ bitmap = gcnew Bitmap(memoryStream); - cv::Mat* mat = BitmapToMat(bitmap); - delete bitmap; - return mat; - } - - static cv::Mat* ByteArrayToMat(array^ byteArray) - { - MemoryStream^ ms = gcnew MemoryStream(byteArray); - cv::Mat* mat = MemoryStreamBitmapToMat(ms); - delete ms; - return mat; - } - }; } \ No newline at end of file diff --git a/src/bindings/csharp/openalpr-net/motiondetector-net.cpp b/src/bindings/csharp/openalpr-net/motiondetector-net.cpp index 63721e9..a9a716b 100644 --- a/src/bindings/csharp/openalpr-net/motiondetector-net.cpp +++ b/src/bindings/csharp/openalpr-net/motiondetector-net.cpp @@ -14,23 +14,20 @@ void AlprMotionDetectionNet::ResetMotionDetection(Bitmap^ bitmap) void AlprMotionDetectionNet::ResetMotionDetection(String^ filename) { - BitmapMat^ wrapper = gcnew BitmapMat(filename); - ResetMotionDetection(wrapper->Value); - delete wrapper; + cv::Mat mat = cv::imread(marshal_as(filename)); + ResetMotionDetection(mat); } void AlprMotionDetectionNet::ResetMotionDetection(MemoryStream^ memoryStream) { - BitmapMat^ wrapper = gcnew BitmapMat(memoryStream); - ResetMotionDetection(wrapper->Value); - delete wrapper; + return ResetMotionDetection(memoryStream->ToArray()); } void AlprMotionDetectionNet::ResetMotionDetection(array^ byteArray) { - BitmapMat^ wrapper = gcnew BitmapMat(byteArray); - ResetMotionDetection(wrapper->Value); - delete wrapper; + std::vector buffer = AlprHelper::ToVector(byteArray); + cv::Mat mat = cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR); + ResetMotionDetection(mat); } System::Drawing::Rectangle AlprMotionDetectionNet::MotionDetect(Bitmap^ bitmap) @@ -43,26 +40,21 @@ System::Drawing::Rectangle AlprMotionDetectionNet::MotionDetect(Bitmap^ bitmap) System::Drawing::Rectangle AlprMotionDetectionNet::MotionDetect(String^ filename) { - BitmapMat^ wrapper = gcnew BitmapMat(filename); - System::Drawing::Rectangle motion = MotionDetect(wrapper->Value); - delete wrapper; + cv::Mat mat = cv::imread(marshal_as(filename)); + System::Drawing::Rectangle motion = MotionDetect(mat); return motion; } System::Drawing::Rectangle AlprMotionDetectionNet::MotionDetect(MemoryStream^ memoryStream) { - BitmapMat^ wrapper = gcnew BitmapMat(memoryStream); - System::Drawing::Rectangle motion = MotionDetect(wrapper->Value); - delete wrapper; - return motion; + return MotionDetect(memoryStream->ToArray()); } System::Drawing::Rectangle AlprMotionDetectionNet::MotionDetect(array^ byteArray) { - BitmapMat^ wrapper = gcnew BitmapMat(byteArray); - System::Drawing::Rectangle motion = MotionDetect(wrapper->Value); - delete wrapper; - return motion; + std::vector buffer = AlprHelper::ToVector(byteArray); + cv::Mat mat = cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR); + return MotionDetect(mat); } void AlprMotionDetectionNet::ResetMotionDetection(cv::Mat mat) diff --git a/src/bindings/csharp/openalpr-net/openalpr-net.cpp b/src/bindings/csharp/openalpr-net/openalpr-net.cpp index d1519c9..fb9183b 100644 --- a/src/bindings/csharp/openalpr-net/openalpr-net.cpp +++ b/src/bindings/csharp/openalpr-net/openalpr-net.cpp @@ -361,8 +361,7 @@ namespace openalprnet { /// Recognize from an image on disk /// AlprResultsNet^ Recognize(System::String^ filepath) { - AlprResults results = m_Impl->recognize(marshal_as(filepath)); - return gcnew AlprResultsNet(results); + return Recognize(filepath, gcnew List()); } /// @@ -419,7 +418,7 @@ namespace openalprnet { /// Recognize from byte data representing an encoded image (e.g., BMP, PNG, JPG, GIF etc). /// /// Bytes representing image data - AlprResultsNet^ Recognize(cli::array^ imageBuffer) { + AlprResultsNet^ Recognize(array^ imageBuffer) { return Recognize(imageBuffer, gcnew List()); } @@ -427,7 +426,7 @@ namespace openalprnet { /// Recognize from byte data representing an encoded image (e.g., BMP, PNG, JPG, GIF etc). /// /// Bytes representing image data - AlprResultsNet^ Recognize(cli::array^ imageBuffer, List^ regionsOfInterest) { + AlprResultsNet^ Recognize(array^ imageBuffer, List^ regionsOfInterest) { std::vector buffer = AlprHelper::ToVector(imageBuffer); std::vector rois = AlprHelper::ToVector(regionsOfInterest); AlprResults results = m_Impl->recognize(buffer, rois); @@ -437,14 +436,14 @@ namespace openalprnet { /// /// Recognize from raw pixel data /// - AlprResultsNet^ Recognize(cli::array^ imageBuffer, int bytesPerPixel, int imgWidth, int imgHeight) { + AlprResultsNet^ Recognize(array^ imageBuffer, int bytesPerPixel, int imgWidth, int imgHeight) { return Recognize(imageBuffer, bytesPerPixel, imgWidth, imgHeight, gcnew List()); } /// /// Recognize from raw pixel data /// - AlprResultsNet^ Recognize(cli::array^ imageBuffer, int bytesPerPixel, int imgWidth, int imgHeight, List^ regionsOfInterest) { + AlprResultsNet^ Recognize(array^ imageBuffer, int bytesPerPixel, int imgWidth, int imgHeight, List^ regionsOfInterest) { unsigned char* p = AlprHelper::ToCharPtr(imageBuffer); std::vector rois = AlprHelper::ToVector(regionsOfInterest); AlprResults results = m_Impl->recognize(p, bytesPerPixel, imgWidth, imgHeight, rois); @@ -458,7 +457,7 @@ namespace openalprnet { array^ PreWarp(array^ imageBuffer) { std::vector buffer = AlprHelper::ToVector(imageBuffer); - cv::Mat src = cv::imdecode(buffer, 1); + cv::Mat src = cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR); alpr::PreWarp *preWarp = new alpr::PreWarp(m_Impl->getConfig()); cv::Mat warpedImage = preWarp->warpImage(src); diff --git a/src/openalpr/support/re2/re2.cc b/src/openalpr/support/re2/re2.cc index aea5f6e..3f0020f 100644 --- a/src/openalpr/support/re2/re2.cc +++ b/src/openalpr/support/re2/re2.cc @@ -36,7 +36,7 @@ const VariadicFunction2 const VariadicFunction2 RE2::FindAndConsume = {}; // This will trigger LNK2005 error in MSVC. -#ifndef COMPILER_MSVC +#ifndef WIN32 const int RE2::Options::kDefaultMaxMem; // initialized in re2.h #endif // COMPILER_MSVC diff --git a/src/openalpr/support/re2/util/stringprintf.cc b/src/openalpr/support/re2/util/stringprintf.cc index 3c9c14b..5f1869f 100644 --- a/src/openalpr/support/re2/util/stringprintf.cc +++ b/src/openalpr/support/re2/util/stringprintf.cc @@ -14,7 +14,12 @@ static void StringAppendV(string* dst, const char* format, va_list ap) { // the data in it upon use. The fix is to make a copy // of the structure before using it and use that copy instead. va_list backup_ap; + + #if defined(WIN32) + backup_ap = ap; + #else va_copy(backup_ap, ap); + #endif int result = vsnprintf(space, sizeof(space), format, backup_ap); va_end(backup_ap); @@ -37,7 +42,12 @@ static void StringAppendV(string* dst, const char* format, va_list ap) { char* buf = new char[length]; // Restore the va_list before we use it again + #if defined(WIN32) + va_list backup_ap = ap; + #else va_copy(backup_ap, ap); + #endif + #ifdef WIN32 result = vsnprintf_s(buf, length, length, format, backup_ap); #else diff --git a/src/openalpr/support/re2/util/strutil.cc b/src/openalpr/support/re2/util/strutil.cc index 215923a..ab28df7 100644 --- a/src/openalpr/support/re2/util/strutil.cc +++ b/src/openalpr/support/re2/util/strutil.cc @@ -1,7 +1,7 @@ // Copyright 1999-2005 The RE2 Authors. All Rights Reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. - +#include #include "re2/util/util.h" #include "re2/stringpiece.h" @@ -41,7 +41,7 @@ int CEscapeString(const char* src, int src_len, char* dest, #ifdef WIN32 sprintf_s(dest + used, dest_len, "\\%03o", c); #else - sprintf(dest + used, "\\%03o", c); + std::sprintf(dest + used, "\\%03o", c); #endif used += 4; diff --git a/src/openalpr/support/timing.cpp b/src/openalpr/support/timing.cpp index 82c8374..222c588 100644 --- a/src/openalpr/support/timing.cpp +++ b/src/openalpr/support/timing.cpp @@ -67,7 +67,7 @@ namespace alpr microseconds = (double)t.QuadPart / frequencyToMicroseconds; t.QuadPart = microseconds; tv->tv_sec = t.QuadPart / 1000000; - tv->tv_usec = t.QuadPart % 1000000; + tv->tv_nsec = t.QuadPart % 1000000; return (0); } @@ -83,7 +83,7 @@ namespace alpr timespec time_start; time_start.tv_sec = 0; - time_start.tv_usec = 0; + time_start.tv_nsec = 0; return diffclock(time_start, time); } @@ -92,7 +92,7 @@ namespace alpr double diffclock(timespec time1,timespec time2) { timespec delta = diff(time1,time2); - double milliseconds = (delta.tv_sec * 1000) + (((double) delta.tv_usec) / 1000.0); + double milliseconds = (delta.tv_sec * 1000) + (((double) delta.tv_nsec) / 10000.0); return milliseconds; } @@ -100,15 +100,15 @@ namespace alpr timespec diff(timespec start, timespec end) { timespec temp; - if ((end.tv_usec-start.tv_usec)<0) + if ((end.tv_nsec-start.tv_nsec)<0) { temp.tv_sec = end.tv_sec-start.tv_sec-1; - temp.tv_usec = 1000000+end.tv_usec-start.tv_usec; + temp.tv_nsec = 1000000+end.tv_nsec-start.tv_nsec; } else { temp.tv_sec = end.tv_sec-start.tv_sec; - temp.tv_usec = end.tv_usec-start.tv_usec; + temp.tv_nsec = end.tv_nsec-start.tv_nsec; } return temp; } diff --git a/src/openalpr/support/timing.h b/src/openalpr/support/timing.h index 9a022e6..cf715cc 100644 --- a/src/openalpr/support/timing.h +++ b/src/openalpr/support/timing.h @@ -1,12 +1,24 @@ -#ifndef TIMING_H -#define TIMING_H +#ifndef OPENALPR_TIMING_H +#define OPENALPR_TIMING_H #include #include #include + + #ifdef WINDOWS // Import windows only stuff + #include + #if _MSC_VER < 1900 + struct timespec + { + time_t tv_sec; // Seconds - >= 0 + long tv_nsec; // Nanoseconds - [0, 999999999] + }; + #else + //#define timespec timeval + #endif #else #include #endif @@ -17,13 +29,6 @@ #include #endif -// Support for Windows -#ifdef WINDOWS -#include - -#define timespec timeval -#endif - namespace alpr {