2016-07-11 6 views
-1

Ich versuche, die Remap-Funktion in OpenCV zu verwenden. Ich habe eine STMap, also sind die x Werte im roten Kanal und y Werte sind im grünen Kanal.OpenCV - Fehler beim Aufteilen der Kanäle

ich hier meine Quelle Bild laden, die ich zuordnen möchten, und die stmap:

Mat image3= imread("stmap.tif", CV_32FC1); 
Mat image4= imread("source.tif", CV_LOAD_IMAGE_UNCHANGED); 

Dann teile ich die Kanäle, die roten und grünen von meinem stmap zu bekommen:

Mat bgr[3]; //destination array 
split(image3,bgr);//split source 

bgr[0].convertTo(bgr[0],CV_32FC1); 
bgr[1].convertTo(bgr[1],CV_32FC1); 
bgr[2].convertTo(bgr[2],CV_32FC1); 
Mat dst; 

Und schließlich die Neuzuordnung Teil:

remap(image4, dst,bgr[2],bgr[1],INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0)); 

Allerdings, wenn ich die dst Anzeige Mat, es ist alles schwarz. Ich habe versucht, wie einige Werte an die Konsole Ausdrucken:

cout << bgr[2].at<float>(1000,300); 

aber sie sind alle 0. Ich zeigte bgr[1] und bgr[2] und sie sind definitiv nicht alle schwarz - sie sind Graustufen Gradienten, wie sie sein sollten.

Also was könnte das Problem sein?

Danke!

EDIT:

Ich bemerkte, dass, wenn ich eine JPEG-Datei und den Befehl verwenden würde:

cout << bgr2[2].at<float>(1000,300); 

Es ist mir so etwas wie 0.1828510

Aber geben würde, wenn ich die laufen der gleiche Befehl mit einem 32bit .tif, gibt es mir:

1.04984e-320 

BEARBEITEN 2:

Wie soll ich die convertMaps() Funktion verwenden?

Dies ist, was ich versucht, und hat nicht funktioniert:

Mat image3= imread("STMap.jpg"); 
Mat image4= imread("image.jpg"); 

    Mat bgr[3]; 
    split(image3,bgr); 
    Mat map_x, map_y; 
    map_x.create(image.size(), CV_32FC1); 
    map_y.create(image.size(), CV_32FC1);  
    convertMaps(bgr[2], bgr[1], map_x, map_y, CV_32FC1); 

Auch wenn ich verwendet convertTo():

bgr[2].convertTo(red_channel, CV_32FC1, 1/255.0) 

bgr[2] korrekt angezeigt (das Graustufenbild von Mapping-Intensitäten) und der red_channel hatte alle seine Werte zwischen 0,0 und 1,0

Antwort

0

Ihre Anrufe zu convertTo() machen überhaupt keinen Sinn. Werfen Sie auch einen Blick auf die Dokumentation remap() und Sie finden einen Verweis auf convertMap(), die die Methode der Wahl für die Änderung des Matrixtyps ist (wenn Sie wirklich müssen!).

remap() erwartet, dass der Eingang in einem bestimmten Bereich liegt, wahrscheinlich auch abhängig vom Typ der Eingangsmatrix. Wenn es mit JPEGs aber nicht mit 32 Bit TIFF funktioniert, erwarte ich, dass Sie ein Datenbereichsproblem haben.

+0

Auch ohne den Aufruf von 'convertTo()' gibt es das gleiche Ergebnis. Also, wie würde ich 'remap()' verwenden, um es mit einem 32bit .tif STMap und einem entsprechenden 32bit .tif arbeiten zu lassen? – YaronGh

+0

Kein Wunder, dass es nicht funktioniert ohne 'convertTo()', wie ich sagte, es macht keinen Sinn und tut nichts. – ypnos

+0

Warum würde es keinen Sinn ergeben, wenn mein Datentyp irgendwie ist und ich versuche, ihn auf den Bereich 0.0-1.0 zu "klemmen", so dass er vom Typ 'CV_32FC1' wäre und daher von' remap() 'akzeptiert würde Funktion? – YaronGh