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.
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.Détection de rectangle
https://github.com/shibatch/rectdetect https://www.youtube.com/watch?v=HpaY0HOomAI https://www.youtube.com/watch?v=BLJEYui0XcY
Détecté en mouvement
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
mac linux gagner (je vais omettre cette fois.)
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/
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
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.
conda install -c menpo opencv=2.4.11
or
conda install -c menpo opencv3=3.1.0
Ç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 ..
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.
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
sudo make uninstall
Environnement d'exploitation que vous essayez
pyenv
anaconda
python2.7
mac
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()
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.
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 th> | Contenu th> |
---|---|
haarcascade_eye.xml | yeux td> |
haarcascade_eye_tree_eyeglasses.xml | lunettes td> |
haarcascade_frontalcatface.xml | Visage de chat (avant) td> |
haarcascade_frontalcatface_extended.xml | Visage de chat (avant) td> |
haarcascade_frontalface_alt.xml | Face (avant) td> |
haarcascade_frontalface_alt2.xml | Face (avant) td> |
haarcascade_frontalface_alt_tree.xml | Face (avant) td> |
haarcascade_frontalface_default.xml | Face (avant) td> |
haarcascade_fullbody.xml | tout le corps td> |
haarcascade_lefteye_2splits.xml | œil gauche td> |
haarcascade_licence_plate_rus_16stages.xml | Plaque d'immatriculation russe (entière) td> |
haarcascade_lowerbody.xml | Bas du corps td> |
haarcascade_profileface.xml | Visage (photo d'épreuve) td> |
haarcascade_righteye_2splits.xml | œil droit td> |
haarcascade_russian_plate_number.xml | Plaque d'immatriculation russe (numéro) td> |
haarcascade_smile.xml | Sourire td> |
haarcascade_upperbody.xml | haut du corps td> |
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()
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
Les caractéristiques sont calculées à partir de l'histogramme. https://pebbie.wordpress.com/2011/11/10/local-binary-pattern-in-opencv-python/
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)
Calcul des caractéristiques basé sur la distribution de la luminosité dans la direction du dégradé.
sample.py
import cv2
converter = cv2.HOGDescriptor()
img = cv2.imread('test.png')
hog = hog.compute(img)
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
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()
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()
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.
#!/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()
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)
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
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.
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
--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
Mat image(240, 320, CV 8UC3);
image.create(480, 640, CV 8UC3);
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.;
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();
randu(image, Scalar(0), Scalar(256)); //Distribution uniforme
randn(image, Scalar(128), Scalar(10)); //distribution normale
(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;
Mat newC2 = cvarrToMat(oldC0).clone();
vector<Point2f> ptvec = Mat <Point2f>(iP);
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;
--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);
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.
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);
--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));
--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
--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;
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.
// 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;
}
--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.
--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.
--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.
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/
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