Créez une roue de votre propre module OpenCV

Je travaille à temps partiel chez ALBERT Co., Ltd. Je n'ai jamais posté sur Qiita auparavant, mais je le posterai pour la première fois.

Motivation

Lors de l'analyse de données, etc., je lis souvent des images avec Python et j'effectue un traitement simple, donc j'aimerais OpenCV. La plupart des gens le feraient avec Anaconda, mais personnellement, je ne veux pas quitter l'écosystème Python, et j'aimerais spécifier les bibliothèques avec lesquelles établir un lien.

C'est pourquoi vous construisez OpenCV. Je pense qu'il y a des explications sur la façon de le construire, donc je vais l'omettre. Cela créera un fichier tel que cv2. D'une manière ou d'une autre .so en tant que module Python. Pour l'installer globalement, faites simplement make install.

Cependant, à partir de l'environnement créé avec virtualenv (ou venv), ce module cv2 ne peut pas être vu à moins que --system-site-packages soit ajouté. Si je copie en quelque sorte cv2.so sur site-packages dans l'environnement virtualenv, cela fonctionne, mais ce n'est tout simplement pas cool.

Alors je me suis demandé si je pouvais transformer cela en roue.

Comment faire

Ce que je veux vraiment faire, c'est "Je veux faire une extension pré-intégrée dans une roue", mais cela ne semble pas être pris en charge.

Par conséquent, j'ai fait beaucoup d'erreurs, mais j'ai réussi à le faire. Je faisais principalement référence

Il ya trois.

Tout d'abord, la structure des répertoires est la suivante.

--+-- cv2 --+-- _native --+-- cv2.en quelque sorte.so
  |         |             |
  |         |             +-- __init__.py
  |         | 
  |         +-- __init__.py
  |
  +-- setup.py
  |
  +-- MANIFEST.in

Dans __init __. Py directement sous le répertoire cv2

import * from _native.cv2

Écrire. Le __init __. Py sous le répertoire _native peut être vide.

setup.py est comme suit

from setuptools import setup
from setuptools.dist import Distribution

class BinaryDistribution(Distribution):
    def has_ext_modules(foo):
        return True

setup(
    name='cv2',
    version='1.0',
    packages=['cv2'],
    include_package_data=True,
    distclass=BinaryDistribution,
)

De plus, MANIFEST.in est

include cv2/_native/cv2.en quelque sorte.so

Écrire.

Maintenant, lorsque vous exécutez python setup.py bdist_wheel, vous aurez une roue avec un nom de fichier comme cv2-1.0-cp36-cp36m-linux_x86_64.whl sous dist. Je suis heureux.

Commentaire

Tout ce que vous avez à faire est de créer un package factice et d'exporter toutes les définitions dans le module d'origine cv2. Je voudrais cacher le module d'origine cv2 pour le moment, mais si je renommecv2. D'une manière ou d'une autre .so en _cv2. D'une manière ou d'une autre .so, cela ne fonctionnera pas, alors je l'ai résolu en le mettant dans un autre package. fait.

En vous disant de force que l'extension est incluse en définissant has_ext_modules = True, vous pouvez faire la roue pour que l'installation soit rejetée si vous l'amenez sur un autre OS.

application

numpy et scipy ne fonctionneront pas bien à moins que vous ne les compiliez vous-même et ne les liez à une bibliothèque d'opérations matricielles hautes performances, mais il est également pratique de conserver le résultat compilé sous forme de roue. J'écrirai ce détail plus tard.

Recommended Posts

Créez une roue de votre propre module OpenCV
Créez votre propre exception
Créer un module Python
Créez votre propre middleware Django
(Note) Comment passer le chemin de votre propre module
Apprentissage par renforcement 23 Créez et utilisez votre propre module avec Colaboratory
[Python] journalisation dans votre propre module
Créez votre propre service de résolution de noms
[Django] Créez votre propre page d'erreur 403, 404, 500
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
Créez vos propres commandes Linux en Python
[LLDB] Créez votre propre commande avec Python
Créez votre propre serveur DNS avec Twisted
Créez un modèle pour votre planning Django
Créez un environnement python sur votre Mac
Créer un diagramme de relations des modules Python
Créez votre propre valeur composite avec SQLAlchemy
Créer un graphique à l'aide du module Sympy
Créez votre propre caméra virtuelle avec Python + OpenCV et appliquez des effets originaux
Pour importer votre propre module avec jupyter
[Apprentissage automatique] Créez un modèle d'apprentissage automatique en effectuant un apprentissage par transfert avec votre propre ensemble de données
[python] Créer une liste de différents types de caractères
Créez rapidement votre propre module avec setuptools (python)
[Python] Une compréhension approximative du module de journalisation
Créer une table avec le notebook IPython
Flux de création de votre propre package avec setup.py avec python
Créer un ensemble de données d'images à utiliser pour la formation
Créez votre propre Big Data en Python pour validation
[Python] 2 Créez une carte risque-rendement pour votre portefeuille d'actifs
Racler votre article Qiita pour créer un nuage de mots
Faites de votre curseur une photo de votre choix sous Linux
Créez un lot d'images et gonflez avec ImageDataGenerator
Appelez votre propre module python à partir du package ROS