diff --git a/openalpr-net/openalpr-net.cpp b/openalpr-net/openalpr-net.cpp
index 58eddbb..3c6dc23 100644
--- a/openalpr-net/openalpr-net.cpp
+++ b/openalpr-net/openalpr-net.cpp
@@ -1,257 +1,290 @@
-/*
- * Copyright (c) 2015 Dr. Masroor Ehsan
- *
- * This file is part of OpenAlpr.Net.
- *
- * OpenAlpr.Net is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License
- * version 3 as published by the Free Software Foundation
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#include "stdafx.h"
-#include "openalpr-net.h"
-#include "alpr.h"
-#include
-#include
-#include
-#using
-//#include
-#include
-
-using namespace System;
-using namespace msclr::interop;
-using namespace System::Collections::Generic;
-using namespace System::Runtime::InteropServices;
-
-namespace openalprnet {
-
- ref class StringConverter
- {
- public:
- static std::vector ToVector(array^ src)
- {
- std::vector result(src->Length);
- pin_ptr pin(&src[0]);
- unsigned char *first(pin), *last(pin + src->Length);
- std::copy(first, last, result.begin());
- return result;
- }
-
- static System::String^ ToManagedString(std::string s)
- {
- return gcnew String(s.c_str());
- }
-
- static std::string ToStlString(System::String^ s)
- {
- IntPtr ptr = Marshal::StringToHGlobalAnsi(s);
- if(ptr != IntPtr::Zero)
- {
- std::string tmp(reinterpret_cast(static_cast(ptr)));
- Marshal::FreeHGlobal(ptr);
- return tmp;
- }
- return std::string();
- }
- };
-
- public ref class AlprPlateNet
- {
- public:
- AlprPlateNet(AlprPlate plate){
- //_characters = marshal_as(plate.characters);
- m_characters = StringConverter::ToManagedString(plate.characters);
- m_overall_confidence=plate.overall_confidence;
- m_matches_template=plate.matches_template;
- }
-
- property System::String^ characters {
- System::String^ get() {
- return m_characters;
- }
- }
-
- property float overall_confidence {
- float get() {
- return m_overall_confidence;
- }
- }
-
- property bool matches_template {
- bool get() {
- return m_matches_template;
- }
- }
-
- private:
- System::String^ m_characters;
- float m_overall_confidence;
- bool m_matches_template;
- };
-
- public ref class AlprResultNet
- {
- public:
- AlprResultNet() : m_Impl( new AlprResult ) {}
-
- AlprResultNet(AlprResult* result) : m_Impl( result ) {}
-
- property int requested_topn {
- int get() {
- return m_Impl->requested_topn;
- }
- }
-
- property int regionConfidence {
- int get() {
- return m_Impl->regionConfidence;
- }
- }
-
- property System::String^ region {
- System::String^ get() {
- return StringConverter::ToManagedString(m_Impl->region);
- }
- }
-
- property int result_count {
- int get() {
- return m_Impl->result_count;
- }
- }
-
- property AlprPlateNet^ bestPlate {
- AlprPlateNet^ get() {
- AlprPlateNet^ result = gcnew AlprPlateNet(m_Impl->bestPlate);
- return result;
- }
- }
-
- property List^ topNPlates {
- List^ get() {
- List^ list = gcnew List(m_Impl->topNPlates.size());
- for (std::vector::iterator itr = m_Impl->topNPlates.begin(); itr != m_Impl->topNPlates.end(); itr++)
- {
- list->Add(gcnew AlprPlateNet(*itr));
- }
- return list;
- }
- }
-
- property float processing_time_ms {
- float get() {
- return m_Impl->processing_time_ms;
- }
- }
-
- /*
- AlprCoordinate plate_points[4];
- */
- private:
- AlprResult * m_Impl;
- };
-
- public ref class AlprNet {
- public:
- // Allocate the native object on the C++ Heap via a constructor
- AlprNet(System::String^ country, System::String^ configFile) : m_Impl( new Alpr(marshal_as(country), marshal_as(configFile)) ) { }
-
- // Deallocate the native object on a destructor
- ~AlprNet(){
- delete m_Impl;
- }
-
- property int TopN {
- int get() {
- return m_topN;
- }
- void set( int topn ){
- m_topN = topn;
- m_Impl->setTopN(topn);
- }
- }
-
- property bool DetectRegion {
- bool get() {
- return m_detectRegion;
- }
- void set( bool detectRegion ) {
- m_detectRegion = detectRegion;
- m_Impl->setDetectRegion(detectRegion);
- }
- }
-
- property System::String^ DefaultRegion {
- System::String^ get() {
- return m_defaultRegion;
- }
- void set( System::String^ region ){
- m_defaultRegion = region;
- m_Impl->setDefaultRegion(marshal_as(region));
- }
- }
-
- //std::vector recognize(std::string filepath);
- //std::vector recognize(std::string filepath, std::vector regionsOfInterest);
- //std::vector recognize(std::vector imageBuffer);
- //std::vector recognize(std::vector imageBuffer, std::vector regionsOfInterest);
- List^ recognize(System::String^ filepath) {
- m_results = new std::vector(m_Impl->recognize(marshal_as(filepath)));
- std::vector& runList = *m_results;
- std::vector::iterator itr;
- List^ list = gcnew List(runList.size());
- for (itr = runList.begin(); itr != runList.end(); itr++)
- {
- list->Add(gcnew AlprResultNet(&*itr));
- }
- return list;
- }
-
- List^ recognize(cli::array^ imageBuffer) {
- std::vector p = StringConverter::ToVector(imageBuffer);
- m_results = new std::vector(m_Impl->recognize(p));
- std::vector& runList = *m_results;
- std::vector::iterator itr;
- List^ list = gcnew List(runList.size());
- for (itr = runList.begin(); itr != runList.end(); itr++)
- {
- list->Add(gcnew AlprResultNet(&*itr));
- }
- return list;
- }
-
- bool isLoaded() {
- return m_Impl->isLoaded();
- }
-
- static System::String^ getVersion() {
- return StringConverter::ToManagedString(Alpr::getVersion());
- }
-
- System::String^ toJson() {
- std::string json = m_Impl->toJson(*m_results, -1);
- return StringConverter::ToManagedString(json);
- }
-
- protected:
- // Deallocate the native object on the finalizer just in case no destructor is called
- !AlprNet() {
- delete m_Impl;
- }
-
- private:
- Alpr * m_Impl;
- std::vector* m_results;
- int m_topN;
- bool m_detectRegion;
- System::String^ m_defaultRegion;
- };
+/*
+* Copyright (c) 2015 Dr. Masroor Ehsan
+*
+* This file is part of OpenAlpr.Net.
+*
+* OpenAlpr.Net is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Affero General Public License
+* version 3 as published by the Free Software Foundation
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Affero General Public License for more details.
+*
+* You should have received a copy of the GNU Affero General Public License
+* along with this program. If not, see .
+*/
+
+#include "stdafx.h"
+#include "openalpr-net.h"
+#include "alpr.h"
+#include
+#include
+#include
+#using
+//#include
+#include
+
+using namespace System;
+using namespace msclr::interop;
+using namespace System::Collections::Generic;
+using namespace System::Runtime::InteropServices;
+using namespace System::Drawing;
+
+namespace openalprnet {
+
+ private ref class AlprHelper sealed
+ {
+ public:
+ static std::vector ToVector(array^ src)
+ {
+ std::vector result(src->Length);
+ pin_ptr pin(&src[0]);
+ unsigned char *first(pin), *last(pin + src->Length);
+ std::copy(first, last, result.begin());
+ return result;
+ }
+
+ static std::vector ToVector(List^ src)
+ {
+ std::vector result;
+
+ for each(System::Drawing::Rectangle^ rect in src)
+ {
+ AlprRegionOfInterest roi;
+ roi.x = rect->X;
+ roi.y = rect->Y;
+ roi.height = rect->Height;
+ roi.width = rect->Width;
+ result.push_back(roi);
+ }
+
+ return result;
+ }
+
+ static System::String^ ToManagedString(std::string s)
+ {
+ return gcnew String(s.c_str());
+ }
+
+ static std::string ToStlString(System::String^ s)
+ {
+ IntPtr ptr = Marshal::StringToHGlobalAnsi(s);
+ if(ptr != IntPtr::Zero)
+ {
+ std::string tmp(reinterpret_cast(static_cast(ptr)));
+ Marshal::FreeHGlobal(ptr);
+ return tmp;
+ }
+ return std::string();
+ }
+ };
+
+ public ref class AlprPlateNet sealed
+ {
+ public:
+ AlprPlateNet(AlprPlate plate){
+ //_characters = marshal_as(plate.characters);
+ m_characters = AlprHelper::ToManagedString(plate.characters);
+ m_overall_confidence=plate.overall_confidence;
+ m_matches_template=plate.matches_template;
+ }
+
+ property System::String^ characters {
+ System::String^ get() {
+ return m_characters;
+ }
+ }
+
+ property float overall_confidence {
+ float get() {
+ return m_overall_confidence;
+ }
+ }
+
+ property bool matches_template {
+ bool get() {
+ return m_matches_template;
+ }
+ }
+
+ private:
+ System::String^ m_characters;
+ float m_overall_confidence;
+ bool m_matches_template;
+ };
+
+ public ref class AlprResultNet sealed
+ {
+ public:
+ AlprResultNet() : m_Impl( new AlprResult ) {}
+
+ AlprResultNet(AlprResult* result) : m_Impl( result ) {}
+
+ property int requested_topn {
+ int get() {
+ return m_Impl->requested_topn;
+ }
+ }
+
+ property int regionConfidence {
+ int get() {
+ return m_Impl->regionConfidence;
+ }
+ }
+
+ property System::String^ region {
+ System::String^ get() {
+ return AlprHelper::ToManagedString(m_Impl->region);
+ }
+ }
+
+ property int result_count {
+ int get() {
+ return m_Impl->result_count;
+ }
+ }
+
+ property AlprPlateNet^ bestPlate {
+ AlprPlateNet^ get() {
+ AlprPlateNet^ result = gcnew AlprPlateNet(m_Impl->bestPlate);
+ return result;
+ }
+ }
+
+ property List^ plate_points {
+ List^ get() {
+ List^ list = gcnew List(4);
+ for (int i = 0; i < 4; i++)
+ {
+ list->Add(System::Drawing::Point(m_Impl->plate_points[i].x, m_Impl->plate_points[i].y));
+ }
+ return list;
+ }
+ }
+
+ property List^ topNPlates {
+ List^ get() {
+ List^ list = gcnew List(m_Impl->topNPlates.size());
+ for (std::vector::iterator itr = m_Impl->topNPlates.begin(); itr != m_Impl->topNPlates.end(); itr++)
+ {
+ list->Add(gcnew AlprPlateNet(*itr));
+ }
+ return list;
+ }
+ }
+
+ property float processing_time_ms {
+ float get() {
+ return m_Impl->processing_time_ms;
+ }
+ }
+
+ private:
+ AlprResult * m_Impl;
+ };
+
+ public ref class AlprNet sealed
+ {
+ public:
+ // Allocate the native object on the C++ Heap via a constructor
+ AlprNet(System::String^ country, System::String^ configFile) : m_Impl( new Alpr(marshal_as(country), marshal_as(configFile)) ) { }
+
+ // Deallocate the native object on a destructor
+ ~AlprNet(){
+ delete m_Impl;
+ }
+
+ property int TopN {
+ int get() {
+ return m_topN;
+ }
+ void set( int topn ){
+ m_topN = topn;
+ m_Impl->setTopN(topn);
+ }
+ }
+
+ property bool DetectRegion {
+ bool get() {
+ return m_detectRegion;
+ }
+ void set( bool detectRegion ) {
+ m_detectRegion = detectRegion;
+ m_Impl->setDetectRegion(detectRegion);
+ }
+ }
+
+ property System::String^ DefaultRegion {
+ System::String^ get() {
+ return m_defaultRegion;
+ }
+ void set( System::String^ region ){
+ m_defaultRegion = region;
+ m_Impl->setDefaultRegion(marshal_as(region));
+ }
+ }
+
+ List^ recognize(System::String^ filepath) {
+ m_results = new std::vector(m_Impl->recognize(marshal_as(filepath)));
+ return this->processResults();
+ }
+
+ List^ recognize(System::String^ filepath, List^ regionsOfInterest) {
+ std::vector rois = AlprHelper::ToVector(regionsOfInterest);
+ m_results = new std::vector(m_Impl->recognize(marshal_as(filepath), rois));
+ return this->processResults();
+ }
+
+ List^ recognize(cli::array^ imageBuffer) {
+ std::vector p = AlprHelper::ToVector(imageBuffer);
+ m_results = new std::vector(m_Impl->recognize(p));
+ return this->processResults();
+ }
+
+ List^ recognize(cli::array^ imageBuffer, List^ regionsOfInterest) {
+ std::vector rois = AlprHelper::ToVector(regionsOfInterest);
+ std::vector p = AlprHelper::ToVector(imageBuffer);
+ m_results = new std::vector(m_Impl->recognize(p, rois));
+ return this->processResults();
+ }
+
+ bool isLoaded() {
+ return m_Impl->isLoaded();
+ }
+
+ static System::String^ getVersion() {
+ return AlprHelper::ToManagedString(Alpr::getVersion());
+ }
+
+ System::String^ toJson() {
+ std::string json = m_Impl->toJson(*m_results, -1);
+ return AlprHelper::ToManagedString(json);
+ }
+
+ protected:
+ // Deallocate the native object on the finalizer just in case no destructor is called
+ !AlprNet() {
+ delete m_Impl;
+ }
+
+ private:
+ Alpr * m_Impl;
+ std::vector* m_results;
+ int m_topN;
+ bool m_detectRegion;
+ System::String^ m_defaultRegion;
+
+ List^ processResults() {
+ std::vector& runList = *m_results;
+ std::vector::iterator itr;
+ List^ list = gcnew List(runList.size());
+ for (itr = runList.begin(); itr != runList.end(); itr++)
+ {
+ list->Add(gcnew AlprResultNet(&*itr));
+ }
+ return list;
+ }
+ };
}
\ No newline at end of file