[PYTHON] Déplaçons un peu OpenCv. mac ou linux

ouvrir

Une bibliothèque standard pour le traitement d'images. Le traitement d'image est intéressant. Je veux faire AR VR. La fonction AR est certainement une extension, donc la méthode d'installation est différente. Je dois construire à partir de zéro. De plus, il est gênant que les paramètres soient différents pour chaque fonction d'extension. Par conséquent, je vais l'omettre cette fois.

スクリーンショット 2017-03-24 9.18.48.png Cet échantillon unitaire est un atout payant. La précision est médiocre car les parties telles que les yeux sont estimées par la cascade porc + d'ouverture. スクリーンショット 2017-03-24 9.18.54.png スクリーンショット 2017-03-24 9.19.03.png スクリーンショット 2017-03-24 9.19.11.png

Détection de rectangle スクリーンショット 2020-05-29 22.28.34.png

https://github.com/shibatch/rectdetect https://www.youtube.com/watch?v=HpaY0HOomAI https://www.youtube.com/watch?v=BLJEYui0XcY

Détecté en mouvement

スクリーンショット 2020-05-29 22.31.27.png

https://shibata.naist.jp/~n-sibata/software/baum/ https://www.youtube.com/watch?v=KtO5TxG4T0M

vidéos openencv http://miyamotok0105.hatenablog.com/entry/2017/03/12/182056

Environnement d'exploitation Opencv

mac linux gagner (je vais omettre cette fois.)

environnement de langage opencv

Je pense que cela fonctionne dans plus de langues, mais je vais me concentrer sur ce qui suit. Je peux l'écrire en langage c, mais dans mon cas, j'ai dû utiliser le compilateur g ++. Cependant, il est possible d'utiliser la source écrite en langage c.

C http://opencv.jp/opencv-2svn/c/ http://opencv.jp/opencv-2svn_org/c/ C++ http://opencv.jp/opencv-2svn/cpp/ http://opencv.jp/opencv-2svn_org/cpp/ python http://opencv.jp/opencv-2svn/py/ http://opencv.jp/opencv-2svn_org/py/

Avec opencv2 et opencv3

http://tatsyblog.sakura.ne.jp/wordpress/programming/cpp/662/

Ce domaine semble avoir changé. cv::imread cv::cvtColor cv::TermCriteria cv::VideoCapture::get cv::PCA

Environnement de développement Python

Installation de Python (mac, linux)

J'ai noté la plus courte car il y avait beaucoup de grandes humeurs. Pour ceux qui sont python, c'est le plus court à saisir avec conda. Je n'ai pas écrit sur conda ici. Si vous voulez construire à partir de zéro, vous devriez le faire lorsque vous avez un peu de temps.

Pour conda

conda install -c menpo opencv=2.4.11
or
conda install -c menpo opencv3=3.1.0

Pour construire

Ça prend beaucoup de temps.

git clone https://github.com/Itseez/opencv.git
cd opencv
mkdir build
cd build
cmake ..
make -j4 or make -j8
sudo make install

J'ai joué avec les options quand j'étais malade d'azur.

cmake -D WITH_OPENMP=ON -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_opencv_python2=Off  -D BUILD_opencv_python3=On -D PYTHON2_EXECUTABLE="" -D PYTHON2_INCLUDE_DIR="" -D PYTHON2_LIBRARY="" -D PYTHON2_PACKAGES_PATH="" -D OPENCV_FORCE_PYTHON_LIBS=On -D PYTHON3_PACKAGES_PATH=$PYTHON3_PACKAGES_PATH -D CMAKE_INSTALL_PREFIX=$LOCAL_PREFIX -D WITH_CUDA=Off -D BUILD_opencv_photo=OFF -D BUILD_opencv_shape=OFF -D BUILD_opencv_video=OFF -D ENABLE_NEON=OFF -D WITH_DC1394=ON -D WITH_FFMPEG=OFF ..

Désinstaller Python

Si cela ne fonctionne pas, je peux le mettre et l'effacer plusieurs fois. Dans certains cas, plusieurs versions se chevauchaient ou, dans certains cas, il était préférable de toutes les effacer une fois. Veuillez noter que la version peut être obsolète.

Pour conda

S'il y en a beaucoup, effacez-les tous
conda uninstall -c menpo opencv=2.4.11
conda uninstall opencv
conda uninstall opencv3
Vérifiez si tout a disparu
conda list | grep opencv

Pour construire

sudo make uninstall

Essayez de courir avec Python

Environnement d'exploitation que vous essayez


pyenv
anaconda
python2.7
mac

Légende de la caméra

Dans le cas d'un ordinateur équipé d'un appareil photo, votre visage apparaîtra soudainement. Si vous n'avez pas de numpy, entrez-le.

pip install numpy

sample.py


# -*- coding: utf-8 -*-
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Fonctionnalités de type Haar

Découpez une partie de l'image et calculez la différence locale de luminosité. Classez les catégories en fonction de leurs caractéristiques. 541197b2-2c06-102f-a275-704a8c12136c.png

Vidéo de l'image de l'algorithme. Vous pouvez le voir en le regardant. https://vimeo.com/12774628

Obtenez xml de git et spécifiez. https://github.com/opencv/opencv/blob/master/data/haarcascades

Nom du fichier Contenu
haarcascade_eye.xml yeux
haarcascade_eye_tree_eyeglasses.xml lunettes
haarcascade_frontalcatface.xml Visage de chat (avant)
haarcascade_frontalcatface_extended.xml Visage de chat (avant)
haarcascade_frontalface_alt.xml Face (avant)
haarcascade_frontalface_alt2.xml Face (avant)
haarcascade_frontalface_alt_tree.xml Face (avant)
haarcascade_frontalface_default.xml Face (avant)
haarcascade_fullbody.xml tout le corps
haarcascade_lefteye_2splits.xml œil gauche
haarcascade_licence_plate_rus_16stages.xml Plaque d'immatriculation russe (entière)
haarcascade_lowerbody.xml Bas du corps
haarcascade_profileface.xml Visage (photo d'épreuve)
haarcascade_righteye_2splits.xml œil droit
haarcascade_russian_plate_number.xml Plaque d'immatriculation russe (numéro)
haarcascade_smile.xml Sourire
haarcascade_upperbody.xml haut du corps

sample.py


#python2
import cv2
import sys

cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)

video_capture = cv2.VideoCapture(0)

while True:
    # Capture frame-by-frame
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.CASCADE_SCALE_IMAGE
    )

    # Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # Display the resulting frame
    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()

Correspondance de modèle

Comparez les deux images pour voir si elles sont similaires. Une correspondance presque parfaite est requise, mais une certaine précision est obtenue. Si cela ne fonctionne pas, voir ↓.

http://answers.opencv.org/question/187096/why-opencv-matchtemplate-api-not-detect-all-occurrence-of-image/

En plus de cela, il existe une méthode pour extraire le montant de la caractéristique et spécifier l'emplacement.

Le jumelage combiné à l'apprentissage profond est également intéressant en tant que domaine de recherche.

https://arxiv.org/pdf/1705.08593.pdf https://ricardodeazambuja.com/deep_learning/2017/03/05/easy-peasy_conv_deep_learning_two/ https://github.com/sunsided/convolution-template-matching https://www.jstage.jst.go.jp/article/transinf/E100.D/1/E100.D_2016EDP7233/_pdf http://cs231n.stanford.edu/reports/2017/pdfs/817.pdf

Fonctionnalités LBP

Les caractéristiques sont calculées à partir de l'histogramme. https://pebbie.wordpress.com/2011/11/10/local-binary-pattern-in-opencv-python/ jalan2.jpg

jalan2_lbp.jpg

sample.py


import cv
 
def calc_lbp(im):
    """
    calculate LBP (Local Binary Pattern) image N8 neighborhood
    """
    sz = cv.GetSize(im)
    gr = cv.CreateImage(sz, 8, 1)
    lbp = cv.CreateImage(sz, 8, 1)
     
    #convert to grayscale
    cv.CvtColor(im, gr, cv.CV_BGR2GRAY)
 
    LBPMASK = [(0,-1),(1,-1),(1,0),(1,1),(0,1),(-1,-1),(-1,0),(-1,1)]
     
    for y in xrange(1, sz[1]-2):
        for x in xrange(1, sz[0]-2):
            n = 0
            gv = gr[y,x]
            for i in xrange(len(LBPMASK)):
                m = LBPMASK[i]
                if gr[y+m[1], x+m[0]]>gv:
                    n += 1 << i
            lbp[y,x] = n
             
    return lbp
 
if __name__ == '__main__':
    im = cv.LoadImage('jalan2.jpg')
 
    lbpim = calc_lbp(im)
    cv.ShowImage('lbp', lbpim)
 
    key = cv.WaitKey(0)

Fonctionnalités HOG

Calcul des caractéristiques basé sur la distribution de la luminosité dans la direction du dégradé. 14284822109749698.png 14284829323973886.png

sample.py


 import cv2
 converter = cv2.HOGDescriptor()
 img = cv2.imread('test.png')
 hog = hog.compute(img)

Créer un classificateur en cascade

opencv_createsamples Créez l'image correcte dans un fichier vectoriel. Il est écrit qu'il est bon d'avoir plus de 7 000 images correctes et 3 000 images incorrectes ou plus, mais cela semble être le cas. http://kivantium.hateblo.jp/entry/2015/05/13/153122 https://www.pro-s.co.jp/engineerblog/opencv/post_6397.html

opencv_createsamples -info train.dat -vec train.vec -num 1000

opencv_traincascade Apprentissage automatique avec des fonctionnalités de type Haar, des fonctionnalités LBP ou des fonctionnalités HOG. Expiration d'un fichier xml. Après cela, vous pouvez lire xml et l'utiliser.

opencv_traincascade -data cascade/ -vec train.vec -bg bg.dat -numPos 900 -numNeg 1000 -featureType LBP -mode ALL

Lire la vidéo

Pour la vidéo, j'ai recherché la vidéo qui me plaisait, converti le format en mp4 avec ffmpeg et abaissé le cadre. http://qiita.com/miyamotok0105/items/6de05e5a13e7ffd456fc

sample.py


# -*- coding: utf-8 -*-
import numpy as np
import cv2


cap = cv2.VideoCapture('sample.mp4')
fps = 15
size = (640,480)
cap.set(3, size[0])  # Width
cap.set(4, size[1])  # Heigh
cap.set(5, fps)   # FPS

while(cap.isOpened()):
    ret, frame = cap.read()

    # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Exemple d'utilisation de VideoWriter

La spécification du chargement vidéo OpenCV est que "les dernières images sont nouvellement chargées dans le flux une par une".

# -*- coding: utf-8 -*-
#!/usr/bin/python
import cv2
import time
 
class Camera():
    # Constructor...
    def __init__(self):
 
        self.cap = cv2.VideoCapture(0)  # Prepare the camera...
        

        print("Camera warming up ...")
        time.sleep(1)
        # if self.cap.isOpened(): 
        #     print(self.cap.get(3))
        #     print(self.cap.get(4))

        w     = int(self.cap.get(3))         # Frame width...
        h     = int(self.cap.get(4))         # Frame hight...
        fps   = 20.0                    # Frames per second...
        resolution = (w, h)             # Frame size/resolution...

        # Prepare Capture
        self.ret, self.frame = self.cap.read()
 
        # Prepare output window...
        self.winName = "Motion Indicator"
        cv2.namedWindow(self.winName, cv2.WINDOW_AUTOSIZE)
 
        # Read three images first...
        self.prev_frame     = cv2.cvtColor(self.cap.read()[1],cv2.COLOR_RGB2GRAY)
        self.current_frame  = cv2.cvtColor(self.cap.read()[1],cv2.COLOR_RGB2GRAY)
        self.next_frame     = cv2.cvtColor(self.cap.read()[1],cv2.COLOR_RGB2GRAY)
 
        # Define the codec and create VideoWriter object
        self.fourcc = cv2.VideoWriter_fourcc(*'H264')     # You also can use (*'XVID')
        self.out = cv2.VideoWriter('output.avi',self.fourcc, fps, (w, h), True)
        
    
    # Frame generation for Browser streaming wiht Flask...  
    def get_frame(self):
        self.frames = open("stream.jpg ", 'w+')
        s, img = self.cap.read()
        if s:   # frame captures without errors...
            cv2.imwrite("stream.jpg ", img)  # Save image...
        return self.frames.read()
        
            
    def diffImg(self, tprev, tc, tnex):
        # Generate the 'difference' from the 3 captured images...
        Im1 = cv2.absdiff(tnex, tc)
        Im2 = cv2.absdiff(tc, tprev)
        return cv2.bitwise_and(Im1, Im2)
 
    def captureVideo(self):
        # Read in a new frame...
        self.ret, self.frame = self.cap.read()
        # Image manipulations come here...
                # This line displays the image resulting from calculating the difference between
                # consecutive images...
        diffe = self.diffImg(self.prev_frame, self.current_frame, self.next_frame)
        cv2.imshow(self.winName,diffe)
        
        # Put images in the right order...
        self.prev_frame     = self.current_frame
        self.current_frame  = self.next_frame
        self.next_frame     = cv2.cvtColor(self.frame, cv2.COLOR_RGB2GRAY)
        return()
 
    def saveVideo(self):
        # Write the frame...
        self.out.write(self.frame)
        return()
 
    def __del__(self):
        self.cap.release()
        cv2.destroyAllWindows()
        self.out.release()
        print("Camera disabled and all output windows closed...")
        return()
 
def main():
    # Create a camera instance...
    cam1 = Camera()
 
    while(True):
        # Display the resulting frames...
        cam1.captureVideo()    # Live stream of video on screen...
        cam1.saveVideo()       # Save video to file 'output.avi'...
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    return()
 
if __name__=='__main__':
    main()

Vérifier avec un navigateur

Vous pouvez créer un serveur pour vérifier l'état en utilisant ce qui suit, principalement lorsque vous exécutez le serveur opencv plus http dans un terminal tel que Raspeye. C'est le plus court à exécuter en arrière-plan à l'aide de la commande screen ou de la commande tmux, mais vous pouvez également le placer sur nginx ou apache. Personnellement, apache est pour les débutants.

Exemple utilisant BaseHTTPServer et SocketServer

#!/usr/bin/python
'''
	Author: 
	A Simple mjpg stream http server
	use python2

	python simple_mjeg_streamer_...py

	then see down
	http://127.0.0.1:8080/cam.mjpg
'''
import cv2
from PIL import Image
import threading
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
from SocketServer import ThreadingMixIn
import StringIO

import time
capture=None

class CamHandler(BaseHTTPRequestHandler):
	def do_GET(self):
		if self.path.endswith('.mjpg'):
			self.send_response(200)
			self.send_header('Content-type','multipart/x-mixed-replace; boundary=--jpgboundary')
			self.end_headers()
			while True:
				try:
					rc,img = capture.read()
					if not rc:
						continue
					imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
					jpg = Image.fromarray(imgRGB)
					tmpFile = StringIO.StringIO()
					jpg.save(tmpFile,'JPEG')
					self.wfile.write("--jpgboundary")
					self.send_header('Content-type','image/jpeg')
					self.send_header('Content-length',str(tmpFile.len))
					self.end_headers()
					jpg.save(self.wfile,'JPEG')
					time.sleep(0.05)
				except KeyboardInterrupt:
					break
			return
		if self.path.endswith('.html'):
			self.send_response(200)
			self.send_header('Content-type','text/html')
			self.end_headers()
			self.wfile.write('<html><head></head><body>')
			self.wfile.write('<img src="http://127.0.0.1:8080/cam.mjpg"/>')
			self.wfile.write('</body></html>')
			return


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
	"""Handle requests in a separate thread."""

def main():
	global capture
	capture = cv2.VideoCapture(0)
	# capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 320); 
	# capture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 240);
	# capture.set(cv2.cv.CV_CAP_PROP_SATURATION,0.2);
	global img
	try:
		server = ThreadedHTTPServer(('localhost', 8080), CamHandler)
		print("server started")
		server.serve_forever()
	except KeyboardInterrupt:
		capture.release()
		server.socket.close()

if __name__ == '__main__':
	main()

Exemple utilisant flask

Stockez index.html dans le dossier des modèles. Utilisez la structure de flacon habituelle.

index.html


<html>
  <head>
    <title>Video Streaming Demonstration</title>
  </head>
  <body>
    <h1>Video Streaming Demonstration</h1>
    <img src="{{ url_for('video_feed') }}">
  </body>
</html>

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

#python2

from flask import Flask, render_template, Response
#from camera import VideoCamera
from time import time
from PIL import Image
import cv2
import numpy as np

class Camera(object):
	def __init__(self, cap):
		rc,img = cap.read()

	def get_frame(self):
		self.frames = open("stream.jpg ", 'w+')
		s, img = cap.read()
		if s:	# frame captures without errors...
			cv2.imwrite("stream.jpg ", img)	# Save image...
		return self.frames.read()


cap=cv2.VideoCapture(0)
imagen = cap.read()
app = Flask(__name__)

@app.route('/')
def index():
	return render_template('index.html')

def gen(camera):
	while True:
		frame = camera.get_frame()
		yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(gen(Camera(cap)),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
	app.run(host='0.0.0.0', port=8080, debug=True, threaded=False)

Transférer du navigateur au navigateur

Une bibliothèque qui facilite l'utilisation de p2p. Les clients peuvent communiquer entre eux sans avoir besoin d'un serveur. Dans le détail, il semble qu'il y ait des cas où il peut être connecté et des cas où il ne peut pas être connecté, mais cette fois je n'irai pas trop loin. C'est intéressant car il y a beaucoup d'échantillons.

WebRTC https://webrtc.github.io/samples/ https://tech-sketch.jp/2014/07/webrtcpeerjs1.html

Préférences C ++

Installation C ++ (mac)

brew tap homebrew/science/
brew update
brew install opencv3 --with-contrib --with-python
brew install pkg-config

Installé ci-dessous /usr/local/Celler/opencv3

cd /usr/local/Cellar/opencv3/3.1.0_4/lib/pkgconfig
sudo cp opencv.pc /usr/local/lib/pkgconfig/opencv.pc

Copiez opencv.pc sous pkgconfig.

Afficher l'image

python


#include <stdio.h>
#include <opencv2/opencv.hpp>
//g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` 001.cpp -o 001
using namespace cv;

int main(int argc, char** argv ) {
    Mat image;
    image = imread("../../img/hari.jpeg ", 1 );
    if ( !image.data ) {
        printf("No image data \n");
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);
    waitKey(0);
    return 0;
}
g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` 001.cpp -o 001

# Feuille de calcul OpenCV 2.2 (C ++) C'est pour vous faire savoir quel type de fonction il a.

7vyls.png

Classes importantes dans OpenCV

--Modèle de classe de point dimensionnel à 2 points --Modèle de classe de points 3D Point3 --Taille Taille (largeur, hauteur) Modèle de classe

Les bases de la matrice

Créer une matrice

Mat image(240, 320, CV 8UC3);

(Re) placement de la matrice déclarée

image.create(480, 640, CV 8UC3);

Initialiser la matrice avec des constantes

Mat A33(3, 3, CV 32F, Scalar(5));
Mat B33(3, 3, CV 32F); B33 = Scalar(5);
Mat C33 = Mat::ones(3, 3, CV 32F)*5.;
Mat D33 = Mat::zeros(3, 3, CV 32F) + 5.;

Initialiser la matrice avec une valeur spécifique

double a = CV PI/3;
Mat A22 = (Mat <float>(2, 2) <<
cos(a), -sin(a), sin(a), cos(a));
float B22data[] = {cos(a), -sin(a), sin(a), cos(a)};
Mat B22 = Mat(2, 2, CV 32F, B22data).clone();

Initialiser la matrice avec des nombres aléatoires

randu(image, Scalar(0), Scalar(256)); //Distribution uniforme
randn(image, Scalar(128), Scalar(10)); //distribution normale

Convertir les matrices et autres structures les unes aux autres

(Aucune copie de données)

Mat image alias = image;
float* Idata=new float[480*640*3];
Mat I(480, 640, CV 32FC3, Idata);
vector<Point> iptvec(10);
Mat iP(iptvec); // iP – 10x1 CV 32SC2 matrix
IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);
IplImage oldC1 = newC; CvMat oldC2 = newC;

... (avec copie des données)

Mat newC2 = cvarrToMat(oldC0).clone();
vector<Point2f> ptvec = Mat <Point2f>(iP);

Accéder aux éléments de la matrice

A33.at<float>(i,j) = A33.at<float>(j,i)+1;
Mat dyImage(image.size(), image.type());
for(int y = 1; y < image.rows-1; y++) {
    Vec3b* prevRow = image.ptr<Vec3b>(y-1);
    Vec3b* nextRow = image.ptr<Vec3b>(y+1);
    for(int x = 0; y < image.cols; x++)
        for(int c = 0; c < 3; c++)
            dyImage.at<Vec3b>(y,x)[c] = saturate cast<uchar>(nextRow[x][c] - prevRow[x][c]);
}
Mat <Vec3b>::iterator it = image.begin<Vec3b>(),
itEnd = image.end<Vec3b>();
for(; it != itEnd; ++it)
    (*it)[1] ^= 255;

Fonctionnement de la matrice: copie, lecture aléatoire, sous-matrice

--src.copyTo (dst) Copier dans une autre matrice --src.convertTo (dst, type, scale, shift) Mise à l'échelle et conversion vers un autre type de données --m.clone () Copie profonde de la matrice --m.reshape (nch, rétrécit) Modifie les dimensions de la matrice et le nombre de canaux sans copier les données --m.row (i), m.col (i) Lignes et colonnes de la matrice

Exemple 1. Lisser le ROI de l'image

Mat imgroi = image(Rect(10, 20, 100, 100));
GaussianBlur(imgroi, imgroi, Size(5, 5), 1.2, 1.2);

Exemple 2. Algorithme d'algèbre linéaire

m.row(i) += m.row(j)*alpha;

Exemple 3. Copier le ROI de l'image sur une autre image lors de la conversion

Rect r(1, 1, 10, 20);
Mat dstroi = dst(Rect(0,10,r.width,r.height));
src(r).convertTo(dstroi, dstroi.type(), 1, 0);

Opération de matrice simple

De nombreuses opérations d'arithmétique matricielle, logiques et autres traitements courants dans OpenCV Est implémenté. Par exemple • add(), subtract(), multiply(), divide(), absdiff(), bitwise and(), bitwise or(), bitwise xor(), max(), min(), compare()

Exemple. Fonction de synthèse alpha:

void alphaCompose(const Mat& rgba1, const Mat& rgba2, Mat& rgba dest)
{
    Mat a1(rgba1.size(), rgba1.type()), ra1;
    Mat a2(rgba2.size(), rgba2.type());
    int mixch[]={3, 0, 3, 1, 3, 2, 3, 3};
    mixChannels(&rgba1, 1, &a1, 1, mixch, 4);
    mixChannels(&rgba2, 1, &a2, 1, mixch, 4);
    subtract(Scalar::all(255), a1, ra1);
    bitwise or(a1, Scalar(0,0,0,255), a1);
    bitwise or(a2, Scalar(0,0,0,255), a2);
    multiply(a2, ra1, a2, 1./255);
    multiply(a1, rgba1, a1, 1./255);
    multiply(a2, rgba2, a2, 1./255);
    add(a1, a2, rgba dest);
}

• sum(), mean(), meanStdDev(), norm(), countNonZero(),minMaxLoc(),

Mat delta = (J.t()*J + lambda*
Mat::eye(J.cols, J.cols, J.type()))

.inv(CV SVD)*(J.t()*err); C'est la pierre angulaire de l'algorithme d'optimisation de Le Levenberg-Marquardt.

Traitement d'image

filtration

--filter2D () Filtre linéaire non séparable --septFilter2D () Filtre linéaire de type séparation --boxFilter (), GaussianBlur (), medianBlur (), bilatéralFilter () Lissage d'images avec des filtres linéaires ou non linéaires --Sobel (), Scharr () Calcul des images différentielles --Laplacien () Calcul laplacien --erode (), dilate () Contraction et expansion de l'image

Exemple. Appliquer un filtre passe-haut 3x3 (Ajoutez 128 au total pour qu'aucune valeur négative ne soit perdue):

filter2D(image, image, image.depth(), (Mat <float>(3,3)<<
-1, -1, -1, -1, 9, -1, -1, -1, -1), Point(1,1), 128);

Transformation géométrique

--resize () Redimensionner l'image --getRectSubPix () Extrait le correctif de l'image --warpAffine () Conversion affine d'images --warpPerspective () Conversion en perspective des images --remap () Conversion d'image à usage général

Exemple. Réduisez l'image à la moitié de la racine:

Mat dst; resize(src, dst, Size(), 1./sqrt(2), 1./sqrt(2));

Diverses conversions d'images

--cvtColor () Convertit l'image en un autre espace colorimétrique --threshold (), adaptivethreshold () Convertit l'image en niveaux de gris en image binaire en utilisant un seuil fixe ou variable --Détection des composants concaténés à l'aide de l'algorithme d'expansion de région floodFill () --integral () Calcul de l'image intégrale --distanceTransform () Construction d'une image de distance ou d'un diagramme en bore pour une image binaire

histogramme

--calcHist () Calculer l'histogramme de l'image --calcBackProject () Rétroprojection de l'histogramme --equalizeHist () Normaliser la luminosité et le contraste de l'image --compareHist () Compare deux histogrammes

Exemple. Calculez l'histogramme de teinte-saturation d'une image:

Mat hsv, H; MatND tempH;
cvtColor(image, hsv, CV BGR2HSV);
int planes[]={0, 1}, hsize[] = {32, 32};
calcHist(&hsv, 1, planes, Mat(), tempH, 2, hsize, 0);
H = tempH;

Contour

Pour la signification et l'utilisation des contours, reportez-vous aux exemples dans contours.cpp et squares.cpp. Entrée / sortie de données Le stockage XML / YAML est une collection (imbriquée) qui peut contenir des valeurs scalaires, des structures et diverses listes.

Écriture de données en YAML (ou XML)

// Le type de fichier est déterminé par l'extension

FileStorage fs("test.yml", FileStorage::WRITE);
fs << "i" << 5 << "r" << 3.1 << "str" << "ABCDEFGH";
fs << "mtx" << Mat::eye(3,3,CV 32F);
fs << "mylist" << "[" << CV PI << "1+1" <<
"{:" << "month" << 12 << "day" << 31 << "year"
<< 1969 << "}" << "]";
fs << "mystruct" << "{" << "x" << 1 << "y" << 2 <<
"width" << 100 << "height" << 200 << "lbp" << "[:";
const uchar arr[] = {0, 1, 1, 0, 1, 1, 0, 1};
fs.writeRaw("u", arr, (int)(sizeof(arr)/sizeof(arr[0])));
fs << "]" << "}";

Valeurs scalaires (entier, nombre à virgule flottante, chaîne), matrice, scalaire à l'aide de l'opérateur << Écriture de valeurs vides et d'autres types de vecteurs STL dans le stockage de fichiers je peux Lire les données

//Le type de fichier est déterminé par le contenu
FileStorage fs("test.yml", FileStorage::READ);
int i1 = (int)fs["i"]; double r1 = (double)fs["r"];
string str1 = (string)fs["str"];
Mat M; fs["mtx"] >> M;
FileNode tl = fs["mylist"];
CV Assert(tl.type() == FileNode::SEQ && tl.size() == 3);
double tl0 = (double)tl[0]; string tl1 = (string)tl[1];
int m = (int)tl[2]["month"], d = (int)tl[2]["day"];
int year = (int)tl[2]["year"];
FileNode tm = fs["mystruct"];
Rect r; r.x = (int)tm["x"], r.y = (int)tm["y"];
r.width = (int)tm["width"], r.height = (int)tm["height"];
int lbp val = 0;
FileNodeIterator it = tm["lbp"].begin();
for(int k = 0; k < 8; k++, ++it)
lbp val |= ((int)*it) << k;

Lisez la valeur scalaire à l'aide de l'opérateur de conversion FileNode. Procession Les autres types sont lus à l'aide de l'opérateur >>. Lors de la lecture de la liste Utilisez FileNodeIterator. Écriture et lecture d'images raster

imwrite("myimage.jpg ", image);
Mat image color copy = imread("myimage.jpg ", 1);
Mat image grayscale copy = imread("myimage.jpg ", 0);

Formats de lecture / écriture pour ces fonctions: BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM/PGM/PPM (.p? m), Sun Raster (.sr), JPEG 2000 (.jp2). Chaque format est Prend en charge les images 8 bits, 1 ou 3 canaux. 1 canal Prend également en charge les formats (PNG, JPEG 2000) prenant en charge les images 16 bits Il y a. Charger des images à partir de fichiers vidéo et de caméras

VideoCapture cap;
if(argc > 1) cap.open(string(argv[1])); else cap.open(0);
Mat frame; namedWindow("video", 1);
for(;;) {
    cap >> frame; if(!frame.data) break;
    imshow("video", frame); if(waitKey(30) >= 0) break;
}

Interface graphique simple (module highgui)

--nameWindow (winname, flags) Crée une fenêtre highgui nommée --destroyWindow (winname) détruit la fenêtre spécifiée --imshow (winname, mtx) Afficher l'image dans la fenêtre --waitKey (delay) Attend que la touche soit enfoncée pendant le temps spécifié (ou pour toujours). L'événement est traité pendant le temps d'attente. Appelez cette fonction plusieurs fois par seconde N'oublie pas. --createTrackbar (...) Ajoute une barre de suivi (curseur) à la fenêtre spécifiée. --setMouseCallback (...) Définit le rappel pour les clics de souris et les mouvements dans la fenêtre spécifiée. Pour savoir comment utiliser les fonctions GUI, consultez camshiftdemo.cpp et OpenCV. Voir des exemples.

Calibrage de la caméra, estimation de la posture, estimation de la profondeur

--calibrateCamera () Calibrez la caméra en utilisant plusieurs images du motif de calibrage. --findChessboardCorners () Détecte les points caractéristiques sur le modèle d'étalonnage en damier. --solvPnP () Trouvez l'orientation de l'objet d'origine à partir du résultat de la projection des points caractéristiques. --stericalCalibrate () Étalonne la caméra stéréo. --stereoRectify () Effectue la parallélisation des images de caméra stéréo calibrées. --initUndistortRectifyMap () Calcule la carte de parallélisation (pour remap ()) pour chaque caméra stéréo. --StereoBM, StereoSGBM Un moteur de recherche de points de correspondance stéréo fonctionnant sur des paires stéréo parallélisées. --reprojectImageTo3D () Convertit la carte de disparité en un groupe de points 3D. --findHomography () Trouver la transformation de perspective optimale entre des ensembles de points bidimensionnels.

Les échantillons calibration.cpp et stereo calib.cpp peuvent être utilisés pour calibrer la caméra. Utilisez l'exemple stéréo match.cpp pour obtenir une carte de disparité et un groupe de points 3D.

Détection d'objets

--matchTemplate Recherche la mappe de correspondance pour le modèle d'entrée. --CascadeClassifier Une cascade de classificateurs boostants qui utilise les fonctionnalités Haar et LBP proposées par Viola. Voir facesetect.cpp.

Page anxieuse

Envoyer la vidéo au serveur avec le nœud https://github.com/na2hiro/webrtc-distribution Accélérez le streaming opencv http://nobutobook.blogspot.jp/2016/10/python-opencv.html face tracking https://01.org/developerjourney/face-tracking https://realpython.com/blog/python/face-detection-in-python-using-a-webcam/ http://manmade2.com/simple-home-surveillance-with-opencv-python-and-raspberry-pi/ Python live browser surveillance with motion detection https://github.com/Arri/Py_WebSurveillance streamming https://svds.com/streaming-video-analysis-python/ motion track https://github.com/svetlichnaya/Motion-Tracking Conversion de RVB en couleur de couleur basse https://henrydangprg.com/2016/06/26/color-detection-in-python-with-opencv/

référence

https://www.pro-s.co.jp/engineerblog/opencv/post_6231.html http://qiita.com/hitomatagi/items/04b1b26c1bc2e8081427 http://derivecv.tumblr.com/post/73561473978 http://opencv.jp/opencv-2svn/opencv_cheatsheet.pdf Autour de l'environnement C ++ http://www2.meijo-u.ac.jp/~kohara/cms/technicalreport/opencv_intall4mac http://purple-apple.hatenadiary.jp/entry/2017/02/05/195109

Recommended Posts

Déplaçons un peu OpenCv. mac ou linux
Examinons un peu plus la correspondance des points caractéristiques à l'aide d'OpenCV
C'est un Mac. Qu'est-ce que la commande Linux Linux?
[Partie 2] Construisons un serveur Web avec EC2 Linux
Facilitons un peu la gestion des dépendances avec pip
[Partie 1] Configurons un serveur Micra sur Linux
Créons une application Mac avec Tkinter et py2app
Plus de double démarrage ou de VM! Construisons un environnement Linux avec WSL2 et Windows Terminal [WSL2]