Current section
Files
Jump to
Current section
Files
lib/open_alpr.ex
defmodule OpenALPR do
@moduledoc """
Handle license plate recognition service.
More documentation in http://doc.openalpr.com/api/?api=cloudapi
"""
@doc """
Process image given image URL.
## Parameters
* `:country` - Defines the training data used by OpenALPR. "us" analyzes North-American style plates.
"eu" analyzes European-style plates. Default: `eu`
* `:recognize_vehicle` = Keyword.get(opts, :recognize_vehicle, false)
* `:state` - Corresponds to a US state or EU country code used by OpenALPR pattern recognition.
For example, using "md" matches US plates against the Maryland plate patterns.
Using "fr" matches European plates against the French plate patterns.
Default: `pt`
* `:return_image` - If set to `true`, the image you uploaded will be encoded in base64 and sent back
along with the response. Default: `false`
* `:topn` - The number of results you would like to be returned for plate candidates and vehicle classifications.
Default: `10`
* `:prewarp` - Prewarp configuration is used to calibrate the analyses for the angle of a particular camera.
More information is available here http://doc.openalpr.com/accuracy_improvements.html#calibration
"""
def recognize_url(image_url, opts \\ []) do
query_params = generate_query_params(image_url, opts)
"#{get_base_url!()}/recognize_url"
|> HTTPoison.post("", [], params: query_params)
|> case do
{:ok, %HTTPoison.Response{body: body}} ->
# Improve structure assign
handle_response(body)
{:error, response} ->
# Improve error handling
{:error, response}
end
end
@doc """
Process image given image file path.
## Options
See `recognize_url/2` for all supported options.
"""
def recognize(file_path) do
form =
{:multipart,
[
{"secret_key", get_secret_key!()},
{"country", "eu"},
{"state", "pt"},
{:file, file_path,
{"form-data", [{:name, "image"}, {:filename, Path.basename(file_path)}]}, []}
]}
"#{get_base_url!()}/recognize"
|> HTTPoison.post(form, [])
|> case do
{:ok, %HTTPoison.Response{body: body}} ->
# Improve structure assign
handle_response(body)
{:error, response} ->
# Improve error handling
{:error, response}
end
end
defp handle_response(body) do
response = Jason.decode!(body, keys: :atoms)
object = struct(OpenALPR.Response, response)
if object.error === false do
{:ok, object}
else
{:error, object.error}
end
end
def config() do
"#{get_base_url!()}/recognize_url"
|> HTTPoison.get()
|> case do
{:ok, %HTTPoison.Response{body: body}} ->
# Improve structure assign
{:ok, Jason.decode!(body, keys: :atoms)}
{:error, response} ->
{:error, response}
end
end
defp get_base_url!() do
Application.get_env(:open_alpr, :url, "https://api.openalpr.com/v2")
end
defp get_secret_key!() do
Application.fetch_env!(:open_alpr, :api_key)
end
defp generate_query_params(image_url, opts) do
country = Keyword.get(opts, :country, "eu")
recognize_vehicle = Keyword.get(opts, :recognize_vehicle, false)
state = Keyword.get(opts, :state, "pt")
return_image = Keyword.get(opts, :return_image, false)
topn = Keyword.get(opts, :topn, 10)
prewarp = Keyword.get(opts, :prewarp)
recognize_vehicle_value = if recognize_vehicle, do: 1, else: 0
return_image_value = if return_image, do: 1, else: 0
%{
"image_url" => image_url,
"secret_key" => get_secret_key!(),
"recognize_vehicle" => recognize_vehicle_value,
"country" => country,
"state" => state,
"return_image" => return_image_value,
"topn" => topn,
"prewarp" => prewarp
}
end
end