[PYTHON] Lassen Sie uns OpenCv ein wenig verschieben. Mac oder Linux

opencv

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.

スクリーンショット 2017-03-24 9.18.48.png 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. スクリーンショット 2017-03-24 9.18.54.png スクリーンショット 2017-03-24 9.19.03.png スクリーンショット 2017-03-24 9.19.11.png

Rechteckerkennung スクリーンショット 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

In Bewegung erkannt

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

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

Opencv-Betriebsumgebung

mac linux gewinnen (ich werde diesmal weglassen.)

OpenCV-Sprachumgebung

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/

Mit opencv2 und opencv3

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

Python-Entwicklungsumgebung

Python-Installation (Mac, Linux)

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.

Für conda

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

Zum bauen

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 ..

Python deinstallieren

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.

Für conda

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

Zum bauen

sudo make uninstall

Versuchen Sie, mit Python zu laufen

Betriebsumgebung, die Sie versuchen


pyenv
anaconda
python2.7
mac

Bildunterschrift der Kamera

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()

Haarähnliche Merkmale

Schneiden Sie einen Teil des Bildes aus und berechnen Sie den lokalen Helligkeitsunterschied. Klassifizieren Sie Kategorien anhand ihrer Merkmale. 541197b2-2c06-102f-a275-704a8c12136c.png

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 Inhalt
haarcascade_eye.xml Augen
haarcascade_eye_tree_eyeglasses.xml Brille
haarcascade_frontalcatface.xml Katzengesicht (vorne)
haarcascade_frontalcatface_extended.xml Katzengesicht (vorne)
haarcascade_frontalface_alt.xml Gesicht (vorne)
haarcascade_frontalface_alt2.xml Gesicht (vorne)
haarcascade_frontalface_alt_tree.xml Gesicht (vorne)
haarcascade_frontalface_default.xml Gesicht (vorne)
haarcascade_fullbody.xml ganzer Körper
haarcascade_lefteye_2splits.xml linkes Auge
haarcascade_licence_plate_rus_16stages.xml Russisches Nummernschild (ganz)
haarcascade_lowerbody.xml Unterkörper
haarcascade_profileface.xml Gesicht (Prooffoto)
haarcascade_righteye_2splits.xml rechtes Auge
haarcascade_russian_plate_number.xml Russisches Kennzeichen (Nummer)
haarcascade_smile.xml Lächeln
haarcascade_upperbody.xml Oberkörper

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()

Vorlagenübereinstimmung

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

LBP-Funktionen

Merkmale werden aus dem Histogramm berechnet. 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)

HOG-Funktionen

Merkmalsberechnung basierend auf der Helligkeitsverteilung in Gradientenrichtung. 14284822109749698.png 14284829323973886.png

sample.py


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

Erstellen Sie einen Kaskadenklassifikator

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

Spielen Sie das Video ab

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()

Beispiel mit VideoWriter

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()

Überprüfen Sie mit einem Browser

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.

Beispiel mit BaseHTTPServer und 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()

Beispiel mit Kolben

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)

Übertragung von Browser zu Browser

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

C ++ - Einstellungen

C ++ Installation (Mac)

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.

Bild anzeigen

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

# OpenCV 2.2 Cheet Sheet (C ++) Es dient dazu, Sie wissen zu lassen, welche Art von Funktion es hat.

7vyls.png

Wichtige Klassen in OpenCV

Matrix-Grundlagen

Erstellen einer Matrix

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

(Neu-) Platzierung der deklarierten Matrix

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

Matrix mit Konstanten initialisieren

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.;

Initialisieren Sie die Matrix mit einem bestimmten Wert

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();

Matrix mit Zufallszahlen initialisieren

randu(image, Scalar(0), Scalar(256)); //Gleichmäßige Verteilung
randn(image, Scalar(128), Scalar(10)); //Normalverteilung

Konvertieren Sie Matrizen und andere Strukturen ineinander

(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;

... (mit Datenkopie)

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

Greifen Sie auf die Elemente der Matrix zu

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;

Matrixoperation: Kopieren, Mischen, Submatrix

--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);

Einfache Matrixoperation

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.

Bildverarbeitung

Filtern

--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);

Geometrische Transformation

--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));

Verschiedene Bildkonvertierungen

--cvtColor () Konvertiert das Bild in einen anderen Farbraum --threshold (), adaptivethreshold () Konvertiert ein Graustufenbild mit einem festen oder variablen Schwellenwert in ein Binärbild

Histogramm

--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;

Kontur

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.

Schreiben von Daten in YAML (oder XML)

// 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;
}

Einfache GUI (Highgui-Modul)

--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.

Kamerakalibrierung, Haltungsschätzung, Tiefenschätzung

--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.

Objekterkennung

--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.

Ängstliche Seite

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/

Referenz

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

Lassen Sie uns OpenCv ein wenig verschieben. Mac oder Linux
Lassen Sie uns etwas näher auf den Feature-Point-Matching mit OpenCV eingehen
Es ist ein Mac. Was ist der Linux-Befehl Linux?
[Teil 2] Erstellen wir einen Webserver mit EC2 Linux
Lassen Sie uns das Abhängigkeitsmanagement mit pip etwas einfacher machen
[Teil 1] Lassen Sie uns einen Micra-Server unter Linux einrichten
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
Keine Dual-Boots oder VMs mehr! Erstellen wir eine Linux-Umgebung mit WSL2 und Windows Terminal [WSL2]