Automatic License Plate Recognition library

Overview

openalpr

OpenALPR is an open source Automatic License Plate Recognition library written in C++ with bindings in C#, Java, Node.js, Go, and Python. The library analyzes images and video streams to identify license plates. The output is the text representation of any license plate characters.

Check out a live online demo here: http://www.openalpr.com/demo-image.html

User Guide

OpenALPR includes a command line utility. Simply typing "alpr [image file path]" is enough to get started recognizing license plate images.

For example, the following output is created by analyzing this image: Plate Image

[email protected]:~/openalpr$ alpr ./samplecar.png

plate0: top 10 results -- Processing Time = 58.1879ms.
    - PE3R2X     confidence: 88.9371
    - PE32X      confidence: 78.1385
    - PE3R2      confidence: 77.5444
    - PE3R2Y     confidence: 76.1448
    - P63R2X     confidence: 72.9016
    - FE3R2X     confidence: 72.1147
    - PE32       confidence: 66.7458
    - PE32Y      confidence: 65.3462
    - P632X      confidence: 62.1031
    - P63R2      confidence: 61.5089

Detailed command line usage:

[email protected]:~/openalpr$ alpr --help

USAGE: 

   alpr  [-c <country_code>] [--config <config_file>] [-n <topN>] [--seek
         <integer_ms>] [-p <pattern code>] [--clock] [-d] [-j] [--]
         [--version] [-h] <image_file_path>


Where: 

   -c <country_code>,  --country <country_code>
     Country code to identify (either us for USA or eu for Europe). 
     Default=us

   --config <config_file>
     Path to the openalpr.conf file

   -n <topN>,  --topn <topN>
     Max number of possible plate numbers to return.  Default=10

   --seek <integer_ms>
     Seek to the specified millisecond in a video file. Default=0

   -p <pattern code>,  --pattern <pattern code>
     Attempt to match the plate number against a plate pattern (e.g., md
     for Maryland, ca for California)

   --clock
     Measure/print the total time to process image and all plates. 
     Default=off

   -d,  --detect_region
     Attempt to detect the region of the plate image.  [Experimental] 
     Default=off

   -j,  --json
     Output recognition results in JSON format.  Default=off

   --,  --ignore_rest
     Ignores the rest of the labeled arguments following this flag.

   --version
     Displays version information and exits.

   -h,  --help
     Displays usage information and exits.

   <image_file_path>
     Image containing license plates


   OpenAlpr Command Line Utility

Binaries

Pre-compiled Windows binaries can be downloaded on the releases page

Install OpenALPR on Ubuntu 16.04 with the following commands:

sudo apt-get update && sudo apt-get install -y openalpr openalpr-daemon openalpr-utils libopenalpr-dev

Documentation

Detailed documentation is available at doc.openalpr.com

Integrating the Library

OpenALPR is written in C++ and has bindings in C#, Python, Node.js, Go, and Java. Please see this guide for examples showing how to run OpenALPR in your application: http://doc.openalpr.com/bindings.html

Compiling

Build Status

OpenALPR compiles and runs on Linux, Mac OSX and Windows.

OpenALPR requires the following additional libraries:

- Tesseract OCR v3.0.4 (https://github.com/tesseract-ocr/tesseract)
- OpenCV v2.4.8+ (http://opencv.org/)

After cloning this GitHub repository, you should download and extract Tesseract and OpenCV source code into their own directories. Compile both libraries.

Please follow these detailed compilation guides for your respective operating system:

If all went well, there should be an executable named alpr along with libopenalpr-static.a and libopenalpr.so that can be linked into your project.

Docker

# Build docker image
docker build -t openalpr https://github.com/openalpr/openalpr.git
# Download test image
wget http://plates.openalpr.com/h786poj.jpg
# Run alpr on image
docker run -it --rm -v $(pwd):/data:ro openalpr -c eu h786poj.jpg

Questions

Please post questions or comments to the Google group list: https://groups.google.com/forum/#!forum/openalpr

Contributions

Improvements to the OpenALPR library are always welcome. Please review the OpenALPR design description and get started.

Code contributions are not the only way to help out. Do you have a large library of license plate images? If so, please upload your data to the anonymous FTP located at upload.openalpr.com. Do you have time to "tag" plate images in an input image or help in other ways? Please let everyone know by posting a note in the forum.

License

Affero GPLv3 http://www.gnu.org/licenses/agpl-3.0.html

Commercial-friendly licensing available. Contact: [email protected]

Comments
  • Add GPU support via OpenCL for faster recognition

    Add GPU support via OpenCL for faster recognition

    OpenCL support can be added for license plate detection, binarization, and (in the next version of Tesseract) OCR. This would significantly improve the recognition speed..

    enhancement 
    opened by matthill 47
  • Build instructions for OS X

    Build instructions for OS X

    I started a page on the wiki

    https://github.com/openalpr/openalpr/wiki/Compilation-instructions-(OS-X)

    and will note a question on Stack Overflow that didn't get very far

    http://stackoverflow.com/questions/27268782/openalpr-compiling-error-on-mac

    so I'll log whatever I find that helps here and update the docs as much as I can usefully do.

    opened by vielmetti 26
  • UnsatisfiedLinkError: jni.Alpr.initialize(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;) when compiling in Java

    UnsatisfiedLinkError: jni.Alpr.initialize(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;) when compiling in Java

    I have been trying to make this work for the past 4 days now and no progress, the only progress I have made is migrating from the no openalprjni in java.library.path to this one, according to https://groups.google.com/forum/#!topic/openalpr/VE2daHHUoi4 discussion I have to put all my dlls, config file and runtime_data directly in the same folder, I decided before I could do anything to try and point my library path to the original OpenAlpr directory where everything is in place, and it did not work so I put all the mentioned data in my workspace still nothing, I tried adding the dlls to system 32 it did not work, I then tried adding my OpenAplr folder to my system path and still nothing worked, is there some voodoo I need to do to make it work? am very confused. I am currently usinf Version 2.0.1 precompiled binraries.

    opened by aubryll 20
  • Support for Australian number plates.

    Support for Australian number plates.

    I'm not sure how easy this would be, but it would be awesome if support for Australian number plates was added to this software.

    Part of the reason why I'm not sure how easy this would be comes down to number plates generally varying from state to state. http://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Australia has a pretty good analysis of the differences.

    opened by shadow7412 19
  • How to properly use classifychars?

    How to properly use classifychars?

    I'm following the instructions here: http://doc.openalpr.com/accuracy_improvements.html#producing-tiles-from-actual-plates

    When I run the program with the needed parameters, the "Original" and "Selection dashboard" windows open. P and N both do what they appear to be intended to. However, when I press enter, nothing happens. Nothing also happens, when I try to use the arrow keys to select a rendering, it only says "Did not select and boxes" and does nothing, or, says "You have not tagged any characters" if I've already pressed space. Pressing w does nothing. Pressing space changes the green outline to blue, but nothing else happens. Pressing s results in "You have not tagged any characters" or "Did not select any boxes" based on whether or not I've pressed space.

    I'm sure I'm missing something obvious, but I cannot figure it out. Any help?

    question 
    opened by yaftkoldo 18
  • Provide configuration guide for C# binding

    Provide configuration guide for C# binding

    The c# binding solution under "\src\bindings\csharp" does not build out of the box.

    There is a dependency on OpenCV and it needs to be explained to the user.

    Here are the first steps I took to be able to build the solution:

    1. Build the solution as it is downloaded. You will get the below errors:

    Cannot open include file: 'opencv2/imgproc/imgproc.hpp': No such file or directory Cannot open include file: 'opencv2/opencv.hpp': No such file or directory Cannot open include file: 'opencv2/highgui/highgui.hpp': No such file or directory

    1. Download OpenCV, extract the files. Copy the folder "build\include\opencv2" and paste it into "openalpr-master\openalpr-master\src\bindings\csharp\openalpr-net"

    2. Rebuild the solution. The openalprnet-cli and openalprnet-windemo projects will not be able to locate openalpr-net.dll. Download the binaries from https://github.com/openalpr/openalpr/releases and copy the .dll file to somewhere inside your solution. Delete the old reference from the projects and add the copied file as a reference.

    3. Rebuild the solution. You will get the below errors:

    'openalprnet.AlprNet' does not contain a definition for 'GetVersion' ... 'openalprnet.AlprNet' does not contain a definition for 'IsLoaded' ... 'openalprnet.AlprNet' does not contain a definition for 'Recognize' ... 'openalprnet.AlprNet' does not contain a definition for 'IsLoaded' 'openalprnet.AlprNet' does not contain a definition for 'Recognize' ...

    You will ALSO get the below error.

    Error 32 error LNK1104: cannot open file '........\windows\build\dist\2.1.0\v120\Debug\Win32\opencv_videostab248d.lib' ...

    Which is where I'm stuck.

    The project has a dependency on 'opencv_videostab248d.lib' but I could not find the 2.4.8 version of opencv. The latest version has a opencv_videostab300d.lib file.

    I tried to find where the reference is given to replace the dependency on 2.4.8 with 3.0.0 but I could not find the reference location.

    question 
    opened by emrekenci 18
  • Added an overload to the C# binding for reading plates from a video.

    Added an overload to the C# binding for reading plates from a video.

    Hello Matt,

    This is not a complete pull request but rather the basis for a discussion. I have implemented my idea that we discussed a few days ago. I have added a C# method for processing video which raises an event for each frame. I have two requests to you:

    1. Can you take a look and tell me if you find it general enough and otherwise appropriate to be included?
    2. I haven't tested the event because it's never raised when OpenCV lacks support for FFMPEG. I don't have the time to build OpenCV on my own, and the binaries from your release are not enough - CMake requires the entire structure of an OpenCV set-up. So could you please upload somewhere your OpenCV installation? Of course, if you find the time to test it yourself and decide to merge it, that won't be necessary and I'd only need the new release to download.

    Let me know if I can help further in any way.

    Dimitar

    opened by ddobrev 14
  • Error, Could not find/load native library (libopenalprc.dll) C#

    Error, Could not find/load native library (libopenalprc.dll) C#

    HI, when i am trying to read a image, i am getting this error

    Exception thrown: 'System.DllNotFoundException' in alprnet.dll Could not find/load native library (libopenalprc.dll) Exception thrown: 'System.DllNotFoundException' in alprnet.dll Exception thrown: 'System.DllNotFoundException' in alprnet.dll The thread 0x1a60 has exited with code 0 (0x0). The thread 0x29d0 has exited with code 0 (0x0).

    i am trying to find this DLL(libopenalprc.dll) but not luck yet, can you help me please?

    opened by dawigak 13
  • Valid tasks param values

    Valid tasks param values

    I have signed up, grabbed the YUML, loaded into Swagger and generated Swift code. The API is asking for tasks param (String). I have hunted around but am unable find what I need here?

    public class func recognizePostWithRequestBuilder(secretKey secretKey: String, tasks: [String], image: NSURL, imageBytes: String?, imageUrl: String?, country: String?, state: String?, returnImage: Int?, topn: Int?, prewarp: String?) -> RequestBuilder<Inline_response_200> {
            let path = "/recognize"
            let URLString = SwaggerClientAPI.basePath + path
    
            let nillableParameters: [String:AnyObject?] = [
                "secretKey": secretKey,
                "tasks": tasks,
                "imageBytes": imageBytes,
                "imageUrl": imageUrl,
                "country": country,
                "state": state,
                "returnImage": returnImage,
                "topn": topn,
                "prewarp": prewarp
            ]
            let parameters = APIHelper.rejectNil(nillableParameters)
    
            let requestBuilder: RequestBuilder<Inline_response_200>.Type = SwaggerClientAPI.requestBuilderFactory.getBuilder()
    
            return requestBuilder.init(method: "POST", URLString: URLString, parameters: parameters, isBody: false)
        }
    
    question 
    opened by ghost 13
  • segmentation fault on openalpr/TesseractOcr

    segmentation fault on openalpr/TesseractOcr

    Hello, I have a problem running openalpr on my web cam (/dev/video1), everytime I turn my camera in front of a license plate the program crash because of a segmentation fault (core dumped)

    running openalpr seems to work with sample jpg file but not with my standard webcam over french licence plate

    I tried both the python binding and the command line utility, even the docker with docker run --device=/dev/video1 -it --rm -v $(pwd):/data:ro openalpr -c eu /dev/video1 and every time I get the same result (very rare case of success and then crash instantly after the predictions)

    I installed OpenAlpr by compiling it (not the dependency): http://doc.openalpr.com/opensource.html#compiling-openalpr and I am running ubuntu 18.04LTS

    Standard crash

    ➜ alpr -c eu /dev/video1 
    [1]    25427 segmentation fault (core dumped)  alpr -c eu /dev/video1
    

    valgrind

    ==25180== Memcheck, a memory error detector
    ==25180== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
    ==25180== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
    ==25180== Command: alpr -c eu /dev/video1
    ==25180== 
    ==25180== Conditional jump or move depends on uninitialised value(s)
    ==25180==    at 0xD923C36: nextOnPixelInRasterLow (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD923E7F: nextOnPixelInRaster (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD925019: pixConnCompBB (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD8DD91C: ??? (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD8DDF92: ??? (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD8DEA42: bmfCreate (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0x67EDE0E: tesseract::Tesseract::Tesseract() (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x6795F55: tesseract::TessBaseAPI::Init(char const*, int, char const*, tesseract::OcrEngineMode, char**, int, GenericVector<STRING> const*, GenericVector<STRING> const*, bool, bool (*)(STRING const&, GenericVector<char>*)) (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x67963A5: tesseract::TessBaseAPI::Init(char const*, char const*, tesseract::OcrEngineMode, char**, int, GenericVector<STRING> const*, GenericVector<STRING> const*, bool) (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x4FAA5BE: tesseract::TessBaseAPI::Init(char const*, char const*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4FA95A5: alpr::TesseractOcr::TesseractOcr(alpr::Config*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4FAB9D2: alpr::createOcr(alpr::Config*) (in /usr/lib/libopenalpr.so.2)
    ==25180== 
    ==25180== Conditional jump or move depends on uninitialised value(s)
    ==25180==    at 0xD923C6B: nextOnPixelInRasterLow (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD923E7F: nextOnPixelInRaster (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD925019: pixConnCompBB (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD8DD91C: ??? (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD8DDF92: ??? (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0xD8DEA42: bmfCreate (in /usr/lib/x86_64-linux-gnu/liblept.so.5.0.2)
    ==25180==    by 0x67EDE0E: tesseract::Tesseract::Tesseract() (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x6795F55: tesseract::TessBaseAPI::Init(char const*, int, char const*, tesseract::OcrEngineMode, char**, int, GenericVector<STRING> const*, GenericVector<STRING> const*, bool, bool (*)(STRING const&, GenericVector<char>*)) (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x67963A5: tesseract::TessBaseAPI::Init(char const*, char const*, tesseract::OcrEngineMode, char**, int, GenericVector<STRING> const*, GenericVector<STRING> const*, bool) (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x4FAA5BE: tesseract::TessBaseAPI::Init(char const*, char const*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4FA95A5: alpr::TesseractOcr::TesseractOcr(alpr::Config*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4FAB9D2: alpr::createOcr(alpr::Config*) (in /usr/lib/libopenalpr.so.2)
    ==25180== 
    ==25180== Invalid read of size 8
    ==25180==    at 0x67C7568: tesseract::LTRResultIterator::WordFontAttributes(bool*, bool*, bool*, bool*, bool*, bool*, int*, int*) const (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x4FA9B7F: alpr::TesseractOcr::recognize_line(int, alpr::PipelineData*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4FAB52E: alpr::OCR::performOCR(alpr::PipelineData*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6DDF9: alpr::AlprImpl::analyzeSingleCountry(cv::Mat, cv::Mat, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6C8BF: alpr::AlprImpl::recognizeFullDetails(cv::Mat, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6F2B6: alpr::AlprImpl::recognize(cv::Mat, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6EF0F: alpr::AlprImpl::recognize(unsigned char*, int, int, int, std::vector<alpr::AlprRegionOfInterest, std::allocator<alpr::AlprRegionOfInterest> >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F670E3: alpr::Alpr::recognize(unsigned char*, int, int, int, std::vector<alpr::AlprRegionOfInterest, std::allocator<alpr::AlprRegionOfInterest> >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x1414C5: detectandshow(alpr::Alpr*, cv::Mat, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool) (in /usr/bin/alpr)
    ==25180==    by 0x13EF65: main (in /usr/bin/alpr)
    ==25180==  Address 0x8 is not stack'd, malloc'd or (recently) free'd
    ==25180== 
    ==25180== 
    ==25180== Process terminating with default action of signal 11 (SIGSEGV)
    ==25180==  Access not within mapped region at address 0x8
    ==25180==    at 0x67C7568: tesseract::LTRResultIterator::WordFontAttributes(bool*, bool*, bool*, bool*, bool*, bool*, int*, int*) const (in /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.0)
    ==25180==    by 0x4FA9B7F: alpr::TesseractOcr::recognize_line(int, alpr::PipelineData*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4FAB52E: alpr::OCR::performOCR(alpr::PipelineData*) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6DDF9: alpr::AlprImpl::analyzeSingleCountry(cv::Mat, cv::Mat, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6C8BF: alpr::AlprImpl::recognizeFullDetails(cv::Mat, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6F2B6: alpr::AlprImpl::recognize(cv::Mat, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F6EF0F: alpr::AlprImpl::recognize(unsigned char*, int, int, int, std::vector<alpr::AlprRegionOfInterest, std::allocator<alpr::AlprRegionOfInterest> >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x4F670E3: alpr::Alpr::recognize(unsigned char*, int, int, int, std::vector<alpr::AlprRegionOfInterest, std::allocator<alpr::AlprRegionOfInterest> >) (in /usr/lib/libopenalpr.so.2)
    ==25180==    by 0x1414C5: detectandshow(alpr::Alpr*, cv::Mat, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool) (in /usr/bin/alpr)
    ==25180==    by 0x13EF65: main (in /usr/bin/alpr)
    ==25180==  If you believe this happened as a result of a stack
    ==25180==  overflow in your program's main thread (unlikely but
    ==25180==  possible), you can try to increase the size of the
    ==25180==  main thread stack using the --main-stacksize= flag.
    ==25180==  The main thread stack size used in this run was 8388608.
    ==25180== 
    ==25180== HEAP SUMMARY:
    ==25180==     in use at exit: 46,850,402 bytes in 127,073 blocks
    ==25180==   total heap usage: 463,968 allocs, 336,895 frees, 262,349,856 bytes allocated
    ==25180== 
    ==25180== LEAK SUMMARY:
    ==25180==    definitely lost: 0 bytes in 0 blocks
    ==25180==    indirectly lost: 0 bytes in 0 blocks
    ==25180==      possibly lost: 38,457,401 bytes in 165 blocks
    ==25180==    still reachable: 8,393,001 bytes in 126,908 blocks
    ==25180==                       of which reachable via heuristic:
    ==25180==                         newarray           : 125,264 bytes in 176 blocks
    ==25180==         suppressed: 0 bytes in 0 blocks
    ==25180== Rerun with --leak-check=full to see details of leaked memory
    ==25180== 
    ==25180== For counts of detected and suppressed errors, rerun with: -v
    ==25180== Use --track-origins=yes to see where uninitialised values come from
    ==25180== ERROR SUMMARY: 170 errors from 3 contexts (suppressed: 0 from 0)
    [1]    25180 segmentation fault (core dumped)  valgrind alpr -c eu /dev/video1
    
    opened by Mega-Touk 11
  • Is there a script that does the steps for GPU compile and install?

    Is there a script that does the steps for GPU compile and install?

    I see a lot of steps here to install with GPU https://github.com/openalpr/openalpr/wiki/Compilation-instructions-(Ubuntu-Linux) i was wondering if there is a script to do it all at once.

    perhaps an apt install ..? just like non GPU version?

    opened by moeiscool 11
  • outdated cjson has security issues

    outdated cjson has security issues

    hi, great project!

    The cjson library used by the project seems to be outdated and has security issues. I checked it and found that there is no trigger in the code, but it is still recommended to upgrade.

    https://www.cvedetails.com/product/49776/Cjson-Project-Cjson.html?vendor_id=19164 https://github.com/DaveGamble/cJSON/issues/30

    opened by firmianay 0
  • Bump Newtonsoft.Json from 8.0.3 to 13.0.1 in /src/bindings/csharp/alprnet

    Bump Newtonsoft.Json from 8.0.3 to 13.0.1 in /src/bindings/csharp/alprnet

    Bumps Newtonsoft.Json from 8.0.3 to 13.0.1.

    Release notes

    Sourced from Newtonsoft.Json's releases.

    13.0.1

    • New feature - Add JsonSelectSettings with configuration for a regex timeout
    • Change - Remove portable assemblies from NuGet package
    • Change - JsonReader and JsonSerializer MaxDepth defaults to 64
    • Fix - Fixed throwing missing member error on ignored fields
    • Fix - Fixed various nullable annotations
    • Fix - Fixed annotations not being copied when tokens are cloned
    • Fix - Fixed naming strategy not being used when deserializing dictionary enum keys
    • Fix - Fixed serializing nullable struct dictionaries
    • Fix - Fixed JsonWriter.WriteToken to allow null with string token
    • Fix - Fixed missing error when deserializing JToken with a contract type mismatch
    • Fix - Fixed JTokenWriter when writing comment to an object

    12.0.3

    • New feature - Added support for nullable reference types
    • New feature - Added KebabCaseNamingStrategy
    • Change - Package now uses embedded package icon
    • Fix - Fixed bug when merging JToken with itself
    • Fix - Fixed performance of calling ICustomTypeDescriptor.GetProperties
    • Fix - Fixed serializing Enumerable.Empty and empty arrays on .NET Core 3.0
    • Fix - Fixed deserializing some collection types with constructor
    • Fix - Fixed deserializing IImmutableSet to ImmutableHashSet instead of ImmutableSortedSet
    • Fix - Fixed deserializing IImmutableDictionary to ImmutableDictionary instead of ImmutableSortedDictionary
    • Fix - Fixed deserializing into constructors with more than 256 parameters
    • Fix - Fixed hang when deserializing JTokenReader with preceding comment
    • Fix - Fixed JSONPath scanning with nested indexer
    • Fix - Fixed deserializing incomplete JSON object to JObject
    • Fix - Fixed using StringEnumConverter with naming strategy and specified values

    12.0.2

    • New feature - Added MissingMemberHandling to JsonObjectAttribute and JsonObjectContract
    • New feature - Added constructor to JTokenReader to specify initial path
    • New feature - Added JsonProperty.IsRequiredSpecified
    • New feature - Added JsonContract.InternalConverter
    • Change - Moved embedded debug symbols in NuGet package to a symbol package on NuGet.org
    • Fix - Fixed deserializing nullable struct collections
    • Fix - Fixed memory link when serializing enums to named values
    • Fix - Fixed error when setting JsonLoadSettings.DuplicatePropertyNameHandling to Replace

    12.0.1

    • New feature - Added NuGet package signing
    • New feature - Added Authenticode assembly signing
    • New feature - Added SourceLink support
    • New feature - Added constructors to StringEnumConverter for setting AllowIntegerValue
    • New feature - Added JsonNameTable and JsonTextReader.PropertyNameTable
    • New feature - Added line information to JsonSerializationException
    • New feature - Added JObject.Property overload with a StringComparison
    • New feature - Added JsonMergeSettings.PropertyNameComparison
    • New feature - Added support for multiple Date constructors with JavaScriptDateTimeConverter
    • New feature - Added support for strict equals and strict not equals in JSON Path queries

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Masking Multiple Streams

    Masking Multiple Streams

    Hello I have two camera streams capturing to one ubuntu system right now and if I use the mask setting it will mask both cameras. Is there a way to mask the streams separately?

    opened by inolo 0
  • Motion detection for alprd

    Motion detection for alprd

    Does anyone know how to enable the motion decetion for the openalpr daemon? At the moment I have installed the daemon on my machine and everything works fine. But the CPU usage is high because it is evaluating every picture of the video feed. Is there a flag for the config file? I haven't found anything in the docs. Only for the alpr command line tool but not for the daemon.

    opened by ochstobi 0
Releases(v2.3.0)
Windows 10 interface adjustment tool supports automatic switching of light and dark modes, automatic switching of themes and transparent setting of taskbar

win10_tools Windows 10 interface adjustment tool supports automatic switching of light and dark modes, automatic switching of themes and transparent s

Simon 1 Dec 3, 2021
A read-only, license friendly, FUSE based btrfs implementation

btrfs-fuse About This is a read-only btrfs implementation using FUSE (Filesystem in Userspace). Although btrfs is already in mainline Linux kernel, th

Qu Wenruo 10 Oct 13, 2022
ESP32-CAM with LVGL Speech/Face Recognition IR Control

ESP_MASTER 视频介绍:https://www.bilibili.com/video/BV1SM4y1V7Yb This is a comprehensive project that combines the powerful computing capabilities of ESP32

Kevincoooool 198 Jan 5, 2023
Smart Home Total Solution - Keyword Recognition

Introduction Arm IoT Total Solutions provides a complete solution designed for specific use-cases, leaving developers to focus on what really matters

Arm Software 0 May 7, 2022
a playground for working with fully static tensors and automatic differentiation

This is a playground for learning about how to apply template-meta-programming to get more efficient evaluation for tensor-based automatic differentiation.

Edward Kmett 16 Mar 18, 2021
This repository is used for automatic calibration between high resolution LiDAR and camera in targetless scenes.

livox_camera_calib livox_camera_calib is a robust, high accuracy extrinsic calibration tool between high resolution LiDAR (e.g. Livox) and camera in t

HKU-Mars-Lab 491 Dec 29, 2022
Automatic differentiation with weighted finite-state transducers.

GTN: Automatic Differentiation with WFSTs Quickstart | Installation | Documentation What is GTN? GTN is a framework for automatic differentiation with

null 100 Dec 29, 2022
Weather clock with automatic time synchronization

Clock with weather and automatic time synchronization Features Display The numbers are written in a font similar to handwritten; The change of numbers

Anton Petrusevich 4 Apr 1, 2022
🎻 Automatic Exploit Generation using symbolic execution

S2E Library This repository contains all the necessary components to build libs2e.so. This shared library is preloaded in QEMU to enable symbolic exec

ᴀᴇꜱᴏᴘʜᴏʀ 29 Jan 10, 2022
A Semi Automatic Chessboard Corner Extraction Class

This program realizes semi-automatic chessboard corner extraction, the interface is simple, and the accuracy of corner extraction is guaranteed.

null 1 Oct 6, 2021
Automatic plant growing and monitoring system using Arduino

Plant Automatic Growing and Monitoring System Roadmap Read sensors Ambient Temperature Ambient Moisture Ambient Light Soil Moisture LCD with custom ch

Diego Santos Seabra 1 Oct 7, 2021
Automatic adds AFIX instructions for hydrogen atoms to SHELX input file based on geometry and residual desity

autoHFIX Adds AFIX instructions for hydrogen atoms to SHELX input files based on geometry and residual desity automatically Usage: autoHFIX.exe [-opti

Christian Hübschle 2 Oct 7, 2021
Code for our ECE445/ME470 design: Wireless Charging Table with Automatic Alignment

Qi Wireless Charging Table with Automatic Alignment Code for ECE445/ME470 Senior Design Project SP21 at ZJUI. Team 24: Kaiwen Cao, Tianyi Han, Tingkai

Zikai Liu 2 May 1, 2022
Skrull is a malware DRM, that prevents Automatic Sample Submission by AV/EDR and Signature Scanning from Kernel.

Skrull is a malware DRM, that prevents Automatic Sample Submission by AV/EDR and Signature Scanning from Kernel. It generates launchers that can run malware on the victim using the Process Ghosting technique. Also, launchers are totally anti-copy and naturally broken when got submitted.

Sheng-Hao Ma 413 Dec 10, 2022
automatic fish feeder source code

fishsrv automatic fish feeder. features: uses easily available hardware (espxx, 40x20mm servo, 3d printed assembly) accurate (encoder-based servo will

William Teder 2 Jan 17, 2022
A smart automatic pet feeder based on OM2M

?? A Smart Automatic Pet Feeder Based on OM2M WEB ?? Pet ?? Core functions At present, the system can automatically generate text boxes, drop-down box

newdragon 2 Nov 12, 2021
Automatic Disassembly Desynchronization Obfuscator

desync-cc --- Automatic Disassembly Desynchronization Obfuscator desync-cc is designed as a drop-in replacement for gcc, which applies disassembly des

Ulf Kargén 8 Dec 30, 2022
KDevelop plugin for automatic time tracking and metrics generated from your programming activity.

Wakatime KDevelop Plugin Installation instructions Make sure the project is configured to install to the directory of your choice: In KDevelop, select

snotr 6 Oct 13, 2021