国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Erlang/Elixir: 使用 OpenCV, Python 搭建圖片縮略圖服務器

468122151 / 1976人閱讀

摘要:這篇文章是在上測試和運行的的下的安裝和配置請移步到這里應用程序進程樹默認啟動時初始化個用于處理圖片的工作進程首先安裝需要的工具包使用的版本而不是系統自帶的創建項目模塊圖像處理獲取寬高把原始的二進制圖片數據轉換為把轉換為的圖

這篇文章是在OSX上測試和運行的的, Ubuntu下的安裝和配置請移步到這里

應用程序進程樹, 默認啟動 Poolboy 時, 初始化10個用于處理圖片的 Python 工作進程(Worker)

首先安裝OpenCV需要的工具包
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install python
brew tap homebrew/science
brew install opencv
sudo pip install numpy
sudo pip install matplotlib

使用 Homebrew 的 Python 版本, 而不是 Mac OS X 系統自帶的 Python

alias python="/usr/local/bin/python"
創建 Elixir 項目
?  mix new opencv_thumbnail_server --sup
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/opencv_thumbnail_server.ex
* creating test
* creating test/test_helper.exs
* creating test/opencv_thumbnail_server_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd opencv_thumbnail_server
    mix test

Run "mix help" for more commands.

Elixir 模塊

require Logger
defmodule OpencvThumbnailServer do
  use Application
  def start(_type, _args) do
    Logger.info "Start opencv thumbnail server"
    OpencvThumbnailServer.Supervisor.start_link()
  end
end
defmodule OpencvThumbnailServer.Supervisor do
  use Supervisor

  @config Application.get_env :opencv_thumbnail_server, :settings

  def start_link() do
    Supervisor.start_link(__MODULE__, [], name: {:global,__MODULE__})
  end

  def init([]) do
    pool_options = @config[:poolboy]
    {_, name} = pool_options[:name]
    children = [
      :poolboy.child_spec(name, pool_options, @config[:module_name])
    ]
    supervise(children, strategy: :one_for_all, max_restarts: 1000, max_seconds: 3600)
  end
end
defmodule OpencvThumbnailServer.Worker do
  use GenServer
  @config Application.get_env(:opencv_thumbnail_server, :settings)

  def start_link(python_module) do
    GenServer.start_link(__MODULE__, python_module, [])
  end

  def call_python(worker, function, args) do
    GenServer.call(worker, {:call_python, function, args}, 10_000)
  end

  def init(python_module) do
    IO.puts "Start worker"
    {:ok, pid} = :python.start_link([
      {:python_path, @config[:python_path]},
      {:python, @config[:python]}
    ])
    state = {python_module, pid}
    {:ok, state}
  end

  def handle_call({:call_python, function, args}, _from, state) do
    {module, pid} = state
    result = :python.call(pid, module, function, args)
    reply = {:ok, result}
    {:reply, reply, state}
  end

  def handle_call(_request, _from, state) do
    {:stop, :error, :bad_call, state}
  end

  def handle_info(_msg, {module,py_pid}) do
    {:stop, :error, {module,py_pid}}
  end

  def terminate(_reason, {_, py_pid}) do
    :python.stop(py_pid)
    :ok
  end
end
圖像處理

獲取寬高

# -*- coding: utf-8 -*-

import urllib2 as urllib
import numpy as np
import cv2


def load_image_url(url):
    resp = urllib.urlopen(url)
    buf = resp.read()
    return buf


def load_image_file(filename):
    image = cv2.imdecode(filename, cv2.IMREAD_COLOR)
    return image

def get_photo_sizes():
    return [
        [160, 160],
        [320, 320],
        [640, 640],
        [1060, 1060],
        [1280, 1280]
    ]
def show(buf):
    # print buf
    # x = cv2.imdecode(image, cv2.IMREAD_COLOR)
    # d = cv2.cvtColor(c, cv2.COLOR_RGB2BGR)
    np_ndarray = np.fromstring(buf, dtype=np.uint8)
    x = cv2.imdecode(np_ndarray, cv2.IMREAD_UNCHANGED)
    return cv2.imshow("NBA Image", x)

def write(buf):
    nparray = np.fromstring(buf, dtype=np.uint8)
    img = cv2.imdecode(nparray, cv2.IMREAD_UNCHANGED)
    return cv2.imwrite("/tmp/imwrite.png", img)

# def get_dimension():
#     url = "http://img1.gtimg.com/16/1601/160106/16010642_1200x1000_0.jpg"
#     resp = urllib.urlopen(url)
#     buf = resp.read()
#     x = np.fromstring(buf, dtype=np.uint8)
#     img = cv2.imdecode(x, cv2.IMREAD_UNCHANGED)
#     # height = np.size(img, 0)
#     # width = np.size(img, 1)
#     height, width = image.shape[:2]
#     return (width, height)

def get_dimension(buffer):
    # 把原始的二進制圖片數據轉換為NpArray
    nparray = np.fromstring(buffer, dtype=np.uint8)
    # 把 nparray 轉換為 opencv 的圖像格式
    image = cv2.imdecode(nparray, cv2.IMREAD_UNCHANGED)
    height, width = image.shape[:2]
    return (width, height)

def convert_color():
    url = "http://ww3.sinaimg.cn/mw690/6941baebgw1epzcuv9vmxj20me0hy0u1.jpg"
    resp = urllib.urlopen(url)
    buf = resp.read()
    x = np.fromstring(buf, dtype=np.uint8)
    img = cv2.imdecode(x, cv2.IMREAD_UNCHANGED)

if __name__ == "__main__":
    get_dimension()
在 Erlang 和 Python 之間傳輸二進制數據

Erlang 的binary()數據類型和 Python 之間的映射關系, 在Python 2.x 中二進制數據類型為 str() 表示, Python 3.x 中為 bytes()

buf = resp.read(), 其中變量 buf 的類型為

在 Elixir 我們看到變量 buf 的值為:

{:ok, <<255, 216, 255, 224, 0, 16, 74, 70, 73, 70, 0, 1, 1, 1, 0, 72, 
      0, 72, 0, 0, 255, 219, 0, 67, 0, 8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 
      9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, ...>>}
調用 Python 函數
{:ok, data} = OpencvThumbnailServer.Api.load_image_url("https://segmentfault.com/img/bVwhAW")
OpencvThumbnailServer.Api.get_dimension(data) 
{:ok, {800, 431}}

創建 Python 模塊

之前的 Python 圖像處理模塊可以組織到一個項目中多帶帶維護. 這里使用工具 cookiecutter 創建 Python 一個基本的項目骨架, 用于實現縮略圖的功能

cookiecutter 可以通過多種方式安裝, 包括pip, easy_install, conda, brew

pip install cookiecutter
easy_install cookiecutter
conda install -c https://conda.binstar.org/pydanny cookiecutter
brew install cookiecutter(Mac OS X)

目錄結構

?  opencv_thumbnail git:(master) tree
.
├── AUTHORS.rst
├── CONTRIBUTING.rst
├── HISTORY.rst
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.rst
├── build
│?? ├── bdist.macosx-10.11-x86_64
│?? └── lib
│??     └── opencv_thumbnail
│??         ├── __init__.py
│??         └── opencv_thumbnail.py
├── dist
│?? └── opencv_thumbnail-0.1.0-py2.7.egg
├── docs
│?? ├── Makefile
│?? ├── authors.rst
│?? ├── conf.py
│?? ├── contributing.rst
│?? ├── history.rst
│?? ├── index.rst
│?? ├── installation.rst
│?? ├── make.bat
│?? ├── readme.rst
│?? └── usage.rst
├── opencv_thumbnail
│?? ├── __init__.py
│?? ├── __init__.pyc
│?? ├── opencv_thumbnail.py
│?? └── opencv_thumbnail.pyc
├── opencv_thumbnail.egg-info
│?? ├── PKG-INFO
│?? ├── SOURCES.txt
│?? ├── dependency_links.txt
│?? ├── not-zip-safe
│?? └── top_level.txt
├── requirements_dev.txt
├── setup.cfg
├── setup.py
├── tests
│?? ├── __init__.py
│?? └── test_opencv_thumbnail.py
├── tox.ini
└── travis_pypi_setup.py

9 directories, 36 files
API實現

調用需要從 Poolboy 池中取出一個工作進程, 并調用工作進程的call_python, 進程使用完成后返還給 Poolboy 進程池, 這里對調用過程封裝一下, 以簡化使用.

defmodule OpencvThumbnailServer.Api do
  alias OpencvThumbnailServer.Worker

  def get_dimension(data) do
    worker = :poolboy.checkout(:opencv_thumbnail_server_pool)
    {w, h} = Worker.call_python(worker, :get_dimension, [data])
    :poolboy.checkin(:opencv_thumbnail_server_pool, worker)
    {w, h}
  end

  def load_image_url(url) do
    worker = :poolboy.checkout(:opencv_thumbnail_server_pool)
    image_bin = Worker.call_python(worker, :load_image_url, [url])
    :poolboy.checkin(:opencv_thumbnail_server_pool, worker)
    image_bin
  end
end
源碼

https://github.com/developerworks/opencv_thumbnail_server

參考資料

利用Python和OpenCV將URL直接轉換成OpenCV格式
How to read raw png from an array in python opencv?
Install OpenCV for Python on Mac OS X
Installing scikit-image
How can i read an image from an internet url in python cv2 , scikit image and mahotas
Using Elixir, erlport with Python 2.7.9, receiving an arity error
How to read image from in memory buffer (StringIO) or from url with opencv python library
Python OpenCV convert image to byte string?

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37987.html

相關文章

  • MacOS 安裝 PHP的Tclip擴展實現更好的縮略

    摘要:圖片中有人臉,將自動視為人臉區域為重要區域,將不會被裁剪掉。自動識別其它重要區域。如果圖片中未識別出人臉,則會根據特征分布計算出重區域。源碼地址安裝根據上的說明,在上安裝沒有問題,但在我的上就掛了。首先遇到的問題就是,安裝不過去。 Tclip 用于圖片裁剪,有以下特點: 能進行人臉識別。圖片中有人臉,將自動視為人臉區域為重要區域,將不會被裁剪掉。 自動識別其它重要區域。如果圖片中...

    SwordFly 評論0 收藏0
  • 利用python進行識別相似(一)

    摘要:圖像指紋與漢明距離在介紹下面其他判別相似度的方法前,先補充一些概念。漢明距離為,即代表兩張圖片完全一樣。下一次將講述利用和以訓練好的模型來進行人臉識別。本文參考文章和圖片來源的文章賴勇浩的文章下一篇地址利用進行識別相似圖片二 文章簡介 在網上看到python做圖像識別的相關文章后,真心感覺python的功能實在太強大,因此將這些文章總結一下,建立一下自己的知識體系。當然了,圖像識別這個...

    HitenDev 評論0 收藏0

發表評論

0條評論

468122151

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<