您好,登錄后才能下訂單哦!
如何使用OpenCV及Python搭建圖片縮略圖服務器,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
應用程序進程樹, 默認 Poolboy 中初始化10個用于處理圖片的 Python 工作進程(Worker)
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' |
? 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
<a href="http://www.jobbole.com/members/chkconfig">@config</a> 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 <a href="http://www.jobbole.com/members/chkconfig">@config</a> 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 的binary()數據類型和 Python 之間的映射關系, 在Python 2.x 中二進制數據類型為 str() 表示, Python 3.x 中為 bytes()
buf = resp.read(), 其中變量 buf 的類型為
在 Elixir 我們看的如下的值
Python
{: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, ...>>} |
{:ok, data} = OpencvThumbnailServer.Api.load_image_url("https://segmentfault.com/img/bVwhAW") OpencvThumbnailServer.Api.get_dimension(data) {:ok, {800, 431}} |
之前的 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 |
調用需要從 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 |
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。