Eine Standardbibliothek für die Bildverarbeitung. Bildverarbeitung ist interessant. Ich möchte AR VR machen. Die AR-Funktion ist sicherlich eine Erweiterung, daher unterscheidet sich die Installationsmethode. Ich muss von Grund auf neu bauen. Darüber hinaus ist es problematisch, dass die Einstellungen für jede Erweiterungsfunktion unterschiedlich sind. Deshalb werde ich es diesmal weglassen.
Diese Einheitsstichprobe ist ein bezahlter Vermögenswert. Die Genauigkeit ist schlecht, da die Teile wie die Augen durch die Schwein + Kaskade von opencv geschätzt werden.Rechteckerkennung
https://github.com/shibatch/rectdetect https://www.youtube.com/watch?v=HpaY0HOomAI https://www.youtube.com/watch?v=BLJEYui0XcY
In Bewegung erkannt
https://shibata.naist.jp/~n-sibata/software/baum/ https://www.youtube.com/watch?v=KtO5TxG4T0M
opencv videos http://miyamotok0105.hatenablog.com/entry/2017/03/12/182056
mac linux gewinnen (ich werde diesmal weglassen.)
Ich denke, es funktioniert in mehr Sprachen, aber ich werde mich auf Folgendes konzentrieren. Ich kann es in c-Sprache schreiben, aber in meinem Fall musste ich den g ++ - Compiler verwenden. Es ist jedoch möglich, die in c-Sprache geschriebene Quelle zu verwenden.
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/
Dieser Bereich scheint sich geändert zu haben. cv::imread cv::cvtColor cv::TermCriteria cv::VideoCapture::get cv::PCA
Ich habe mir die kürzeste notiert, weil es viele großartige Stimmungen gab. Für diejenigen, die Python sind, ist es am kürzesten, mit conda einzutreten. Ich habe hier nicht über Conda geschrieben. Wenn Sie von Grund auf neu erstellen möchten, sollten Sie dies tun, wenn Sie etwas Zeit haben.
conda install -c menpo opencv=2.4.11
or
conda install -c menpo opencv3=3.1.0
Es benötigt viel Zeit.
git clone https://github.com/Itseez/opencv.git
cd opencv
mkdir build
cd build
cmake ..
make -j4 or make -j8
sudo make install
Ich habe mit Optionen herumgespielt, als ich an Azurblau erkrankt war.
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 ..
Wenn es nicht funktioniert, kann ich es mehrmals einfügen und löschen. In einigen Fällen überlappten sich mehrere Versionen, oder in einigen Fällen war es besser, alle einmal zu löschen. Bitte beachten Sie, dass die Version möglicherweise veraltet ist.
Wenn es viele gibt, löschen Sie sie alle
conda uninstall -c menpo opencv=2.4.11
conda uninstall opencv
conda uninstall opencv3
Überprüfen Sie, ob alles verschwunden ist
conda list | grep opencv
sudo make uninstall
Betriebsumgebung, die Sie versuchen
pyenv
anaconda
python2.7
mac
Bei einem Computer mit Kamera erscheint plötzlich Ihr Gesicht. Wenn Sie kein Numpy haben, geben Sie es ein.
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()
Schneiden Sie einen Teil des Bildes aus und berechnen Sie den lokalen Helligkeitsunterschied. Klassifizieren Sie Kategorien anhand ihrer Merkmale.
Video des Algorithmusbildes. Sie können es sehen, indem Sie es betrachten. https://vimeo.com/12774628
Holen Sie sich XML von Git und geben Sie an. https://github.com/opencv/opencv/blob/master/data/haarcascades
Dateiname th> | Inhalt th> |
---|---|
haarcascade_eye.xml | Augen td> |
haarcascade_eye_tree_eyeglasses.xml | Brille td> |
haarcascade_frontalcatface.xml | Katzengesicht (vorne) td> |
haarcascade_frontalcatface_extended.xml | Katzengesicht (vorne) td> |
haarcascade_frontalface_alt.xml | Gesicht (vorne) td> |
haarcascade_frontalface_alt2.xml | Gesicht (vorne) td> |
haarcascade_frontalface_alt_tree.xml | Gesicht (vorne) td> |
haarcascade_frontalface_default.xml | Gesicht (vorne) td> |
haarcascade_fullbody.xml | ganzer Körper td> |
haarcascade_lefteye_2splits.xml | linkes Auge td> |
haarcascade_licence_plate_rus_16stages.xml | Russisches Nummernschild (ganz) td> |
haarcascade_lowerbody.xml | Unterkörper td> |
haarcascade_profileface.xml | Gesicht (Prooffoto) td> |
haarcascade_righteye_2splits.xml | rechtes Auge td> |
haarcascade_russian_plate_number.xml | Russisches Kennzeichen (Nummer) td> |
haarcascade_smile.xml | Lächeln td> |
haarcascade_upperbody.xml | Oberkörper 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()
Vergleichen Sie die beiden Bilder, um festzustellen, ob sie ähnlich sind. Eine nahezu perfekte Übereinstimmung ist erforderlich, es wird jedoch eine gewisse Genauigkeit erzielt. Wenn es nicht funktioniert, siehe ↓.
http://answers.opencv.org/question/187096/why-opencv-matchtemplate-api-not-detect-all-occurrence-of-image/
Darüber hinaus gibt es eine Methode zum Extrahieren der Feature-Menge und zum Festlegen des Speicherorts.
Matching kombiniert mit Deep Learning ist auch als Forschungsfeld interessant.
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
Merkmale werden aus dem Histogramm berechnet. 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)
Merkmalsberechnung basierend auf der Helligkeitsverteilung in Gradientenrichtung.
sample.py
import cv2
converter = cv2.HOGDescriptor()
img = cv2.imread('test.png')
hog = hog.compute(img)
opencv_createsamples Machen Sie das richtige Bild in eine Vektordatei. Es steht geschrieben, dass es gut ist, mehr als 7.000 richtige Bilder und 3000 oder mehr falsche Bilder zu haben, aber es scheint der Fall zu sein. 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 Maschinelles Lernen mit Haar-ähnlichen Funktionen, LBP-Funktionen oder HOG-Funktionen. Ausatmen einer XML-Datei. Danach können Sie XML lesen und verwenden.
opencv_traincascade -data cascade/ -vec train.vec -bg bg.dat -numPos 900 -numNeg 1000 -featureType LBP -mode ALL
Für das Video habe ich nach dem Video gesucht, das mir gefallen hat, das Format mit ffmpeg in mp4 konvertiert und den Frame verkleinert. 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()
Die Spezifikation für das Laden von OpenCV-Videos lautet: "Die neuesten Bilder werden nacheinander neu in den Stream geladen."
# -*- 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()
Sie können einen Server erstellen, um den Status zu überprüfen, indem Sie Folgendes verwenden, hauptsächlich wenn Sie den opencv plus http-Server in einem Terminal wie Raspeye ausführen. Es ist am kürzesten, es mit dem Befehl screen oder tmux im Hintergrund auszuführen, aber Sie können es auch auf nginx oder apache platzieren. Persönlich ist Apache für Anfänger.
#!/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()
Speichern Sie index.html im Vorlagenordner. Verwenden Sie die übliche Kolbenstruktur.
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)
Eine Bibliothek, die die Verwendung von p2p vereinfacht. Clients können ohne Server miteinander kommunizieren. Im Detail scheint es Fälle zu geben, in denen es verbunden werden kann und Fälle, in denen es nicht verbunden werden kann, aber dieses Mal werde ich nicht zu sehr in die Tiefe gehen. Es ist interessant, weil es viele Beispiele gibt.
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
Unten installiert /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
Kopieren Sie opencv.pc unter 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
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)); //Gleichmäßige Verteilung
randn(image, Scalar(128), Scalar(10)); //Normalverteilung
(Keine Datenkopie)
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) In eine andere Matrix kopieren --src.convertTo (dst, type, scale, shift) Skalierung und Konvertierung in einen anderen Datentyp --m.clone () Tiefe Kopie der Matrix --m.reshape (nch, verengt) Ändern Sie die Matrixdimensionen und die Anzahl der Kanäle, ohne Daten zu kopieren --m.row (i), m.col (i) Matrixzeilen und -spalten
Beispiel 1. Glätten Sie den Bild-ROI
Mat imgroi = image(Rect(10, 20, 100, 100));
GaussianBlur(imgroi, imgroi, Size(5, 5), 1.2, 1.2);
Beispiel 2. Linearer Algebra-Algorithmus
m.row(i) += m.row(j)*alpha;
Beispiel 3. Kopieren Sie die Bild-ROI während der Konvertierung in ein anderes Bild
Rect r(1, 1, 10, 20);
Mat dstroi = dst(Rect(0,10,r.width,r.height));
src(r).convertTo(dstroi, dstroi.type(), 1, 0);
Viele gängige Matrixarithmetik, logische Operationen und andere Verarbeitungen in OpenCV Ist implementiert. Zum Beispiel • add(), subtract(), multiply(), divide(), absdiff(), bitwise and(), bitwise or(), bitwise xor(), max(), min(), compare()
Beispiel: Alpha-Synthesefunktion:
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); Dies ist der Eckpfeiler des Optimierungsalgorithmus von Le Levenberg-Marquardt.
--filter2D () Nicht trennbarer linearer Filter --septFilter2D () Linearfilter vom Separationstyp --boxFilter (), GaussianBlur (), medianBlur (), bilateralFilter () Glätten von Bildern mit linearen oder nichtlinearen Filtern --Sobel (), Scharr () Berechnung von Differenzbildern
Beispiel: Wenden Sie einen 3x3-Hochpassfilter an (Addiere 128 zur Summe, damit keine negativen Werte verloren gehen):
filter2D(image, image, image.depth(), (Mat <float>(3,3)<<
-1, -1, -1, -1, 9, -1, -1, -1, -1), Point(1,1), 128);
--resize () Bildgröße ändern --getRectSubPix () Bild-Patch extrahieren --warpAffine () Affine Konvertierung von Bildern --warpPerspective () Perspektivische Konvertierung von Bildern --remap () Allzweck-Bildkonvertierung
Beispiel. Reduzieren Sie das Bild auf die Hälfte der Wurzel:
Mat dst; resize(src, dst, Size(), 1./sqrt(2), 1./sqrt(2));
--cvtColor () Konvertiert das Bild in einen anderen Farbraum --threshold (), adaptivethreshold () Konvertiert ein Graustufenbild mit einem festen oder variablen Schwellenwert in ein Binärbild
--calcHist () Bildhistogramm berechnen --calcBackProject () Rückprojektion des Histogramms --equalizeHist () Normalisiert Bildhelligkeit und Kontrast --compareHist () Vergleichen Sie zwei Histogramme
Beispiel: Berechnen Sie das Farbton-Sättigungs-Histogramm eines Bildes:
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;
Informationen zur Bedeutung und Verwendung von Konturen finden Sie in den Beispielen in contours.cpp und squares.cpp. Dateneingabe / -ausgabe XML / YAML-Speicher ist eine (verschachtelbare) Sammlung, die skalare Werte, Strukturen und verschiedene Listen enthalten kann.
// Der Dateityp wird durch die Erweiterung bestimmt
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 << "]" << "}";
Skalarwerte (Ganzzahl, Gleitkommazahl, Zeichenfolge), Matrix, Skalar mit dem Operator << Schreiben leerer Werte und anderer Arten von STL-Vektoren in den Dateispeicher ich kann Daten lesen
//Der Dateityp wird durch den Inhalt bestimmt
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;
Lesen Sie den Skalarwert mit dem FileNode-Cast-Operator. Prozession Andere Typen werden mit dem Operator >> gelesen. Beim Lesen der Liste Verwenden Sie FileNodeIterator. Schreiben und Lesen von Rasterbildern
imwrite("myimage.jpg ", image);
Mat image color copy = imread("myimage.jpg ", 1);
Mat image grayscale copy = imread("myimage.jpg ", 0);
Lese- / Schreibformate für diese Funktionen: BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM/PGM/PPM (.p? m), Sun Raster (.sr), JPEG 2000 (.jp2). Jedes Format ist Unterstützt 8-Bit-, 1- oder 3-Kanal-Bilder. 1 Kanal Unterstützt auch Formate (PNG, JPEG 2000), die 16-Bit-Bilder unterstützen Es gibt. Laden Sie Bilder von Videodateien und Kameras
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 (Gewinnname, Flags) Erstellt ein benanntes Highgui-Fenster --destroyWindow (winname) zerstört das angegebene Fenster --imshow (winname, mtx) Zeigt das Bild im Fenster an --waitKey (Verzögerung) Wartet darauf, dass die Taste für die angegebene Zeit (oder für immer) gedrückt wird. Das Ereignis wird während der Wartezeit verarbeitet. Rufen Sie diese Funktion mehrmals pro Sekunde auf Vergiss nicht. --createTrackbar (...) Fügt dem angegebenen Fenster eine Spurleiste (Schieberegler) hinzu. --setMouseCallback (...) Legt den Rückruf für Mausklicks und Bewegungen innerhalb des angegebenen Fensters fest. Informationen zur Verwendung von GUI-Funktionen finden Sie unter camshiftdemo.cpp und OpenCV. Siehe Beispiele.
--calibrateCamera () Kalibrieren Sie die Kamera anhand mehrerer Bilder des Kalibrierungsmusters. --findChessboardCorners () Erkennt Merkmalspunkte im Schachbrett-Kalibrierungsmuster. --solvPnP () Ermittelt die Ausrichtung des Originalobjekts anhand des Ergebnisses der Projektion der Feature-Punkte. --stericalCalibrate () Kalibriert die Stereokamera. --stereoRectify () Führt eine Parallelisierung kalibrierter Stereokamerabilder durch. --initUndistortRectifyMap () Berechnet die Parallelisierungskarte (für remap ()) für jede Stereokamera. --StereoBM, StereoSGBM Eine Suchmaschine für Stereokorrespondenzpunkte, die auf parallelisierten Stereopaaren ausgeführt wird. --reprojectImageTo3D () Konvertiert die Disparitätskarte in eine Gruppe von 3D-Punkten. --findHomography () Finden Sie die optimale perspektivische Transformation zwischen zweidimensionalen Punktmengen.
Sample calibration.cpp und Stereo calib.cpp können zum Kalibrieren der Kamera verwendet werden. Verwenden Sie die Beispiel-Stereo-Datei match.cpp, um eine Disparitätskarte und eine Gruppe von 3D-Punkten zu erhalten.
--matchTemplate Findet die Übereinstimmungszuordnung für die Eingabevorlage. --CascadeClassifier Eine Kaskade von Boosting-Klassifikatoren, die die von Viola vorgeschlagenen Haar- und LBP-Funktionen verwendet. Siehe faceetetect.cpp. --HOGDescriptor N. Dalals Vorschlag, der HOG-Funktionen verwendet Es ist ein Körperdetektor. Siehe peopledetect.cpp Bitte.
Video mit Knoten an Server senden https://github.com/na2hiro/webrtc-distribution Beschleunigen Sie das OpenCV-Streaming 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 Konvertieren Sie von RGB in Farbe mit niedriger Farbe 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 Rund um die C ++ - Umgebung http://www2.meijo-u.ac.jp/~kohara/cms/technicalreport/opencv_intall4mac http://purple-apple.hatenadiary.jp/entry/2017/02/05/195109
Recommended Posts