2017-02-22 4 views
0

Was wird in C++ vollständig analog zu dieser Funktion sein?OpenCV C++ analog der Python-Methode

# img, channels, mask, bins for each channel, ranges for each channel 
hist2 = cv2.calcHist([img2], [0, 1, 2], None, [32, 32, 32], 
     [50, 256, 50, 256, 50, 256]) 

Wegen C-Schnittstellen kann ich es nicht verstehen. Bereiche in C++ Version setzt in irgendeiner anderen Art und Weise ..

Antwort

0

Wenn Sie sich für die C++ Version der opencv calcHist Funktion, da suchen, ist ein gutes Tutorial auf http://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html#calchist

Es zeigt, wie die Bereiche Parameter zu erklären, was ich vermute ist Ihre Verwirrung

+0

Ja, aber das Problem, dass es für Uniform Hist ist. Für nicht einheitliche ist es völlig unklar, wie die Funktion aufgerufen wird. Speziell für die 3. Implementierung von calcHist mit STL-Parametern. – UndeadDragon

+0

Ich sehe keinen Beweis für opencv mit einer Implementierung für nicht einheitliche Histogramme. Will das das OP? Vielleicht sollten Sie überlegen, unseren eigenen Code für die Implementierung zu schreiben –

+0

Es hat, ist es richtig im Header mit Funktionen und auch hier http://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html. Die Frage ist auch: verwendet Python-Code uniform hist? Weil das Problem ist, dass die Ergebnisse von zwei Bildern in Python und C++ sehr unterschiedlich sind. – UndeadDragon

1

Ich werde auf einen Ihrer Kommentare zuerst antworten. Hier ist ein kurzes Beispiel, das zeigt, wie ein uneinheitliche Histogramm berechnen:

using namespace std; 
using namespace cv; 

Mat img = imread("Lenna.png", IMREAD_COLOR); 

int channels[] = { 0, 1 }; 

Mat histogram; 
int hist_size[] = { 4, 5 }; 

float range_0[] = { 0.0f, 60.0f, 120.0f, 180.0f, 255.0f }; 
float range_1[] = { 0.0f, 50.0f, 100.0f, 150.0f, 200.0f, 255.0f}; 
const float* all_ranges[] = { range_0, range_1 }; 

calcHist(&img, 1, channels, Mat(), histogram, 2, hist_size, all_ranges, false); 

Das Histogramm 4 x 5 Bins haben, also musste ich 5 x 6 sind Grenzen definieren. Das erste Bin für Kanal 0 speichert die Werte aus dem Intervall [0, 60], das zweite Bin speichert Werte aus dem Intervall [60, 120] und so weiter.

Wenn Sie das Argument uniform als wahr wählen, müssen Sie nur die untere Grenze des ersten Bins und die obere Grenze des letzten Bins für jeden Kanal angeben. Der Algorithmus berechnet dann die Bereichsgrenzen, indem er diesen Bereich durch die Anzahl der Bereiche für jeden Kanal dividiert.

Ich denke, dass Sie mit allen Informationen, die ich Ihnen bisher gegeben habe, herausfinden können, wie Sie Ihr Python-Code-Snippet in C++ - Code umschreiben. :)