2016-04-08 22 views
1

Ich kann eine ROI mit einem QRect in einem QImage nicht richtig konvertieren und/oder anzeigen und ein cv :: Mat-Bild aus dem QImage erstellen. Das Problem ist symmetrisch, d. H. Ich kann den ROI nicht richtig erhalten, wenn ich cv :: Rect in einem cv :: Mat benutze und ein QImage aus dem Mat erzeuge. Überraschenderweise funktioniert alles gut, wenn die Breite und die Höhe des cv :: Rect oder des QRect gleich sind.Wie man ROI von/in QImage zu/von cv :: Mat konvertiert?

Im Folgenden ist mein Full-Size-Bild der cv :: Mat matImage. Es ist vom Typ CV_8U und hat eine quadratische Größe von 2048x2048

int x = 614; 
int y = 1156; 

// buggy 
int width = 234; 
int height = 278; 

//working 
// int width = 400; 
// int height = 400; 
QRect ROI(x, y, width, height); 

QImage imageInit(matImage.data, matImage.cols, matImage.rows, QImage::Format_Grayscale8); 
QImage imageROI = imageInit.copy(ROI); 
createNewImage(imageROI); 

unsigned char* dataBuffer = imageROI.bits(); 
cv::Mat tempImage(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, cv::Mat::AUTO_STEP); 

cv::namedWindow("openCV imshow() from a cv::Mat image", cv::WINDOW_AUTOSIZE); 
cv::imshow("openCV imshow() from a cv::Mat image", tempImage); 

Der Screenshot unten zeigt das Problem.

full size and ROI (Links) Die Originalgröße cv::Mat matImage. (Mitte) das erwartete Ergebnis aus der QImage und der QRect (die in etwa entspricht das grüne Rechteck von Hand gezeichnet). (rechts) das verkorkste Ergebnis aus den cv::Mat matImageROI

+0

Ich benutze Qt 5.6 und openCV 3.1, Mac OS X 10.10.5, Macbook Pro Retina. –

Antwort

0

Durch andere Fragen in Bezug auf der Erkundung Konvertierung zwischen cv::Mat und QImage, so scheint es der Schritt „non-standard“ in einigen bestimmten ROI Größen wird. Zum Beispiel von this post, fand ich heraus, man muss nur cv::Mat::AUTO_STEP-imageROI.bytesPerLine() in verändern cv::Mat tempImage(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, cv::Mat::AUTO_STEP);

so habe ich am Ende statt mit: cv::Mat matImageROI(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, imageROI.bytesPerLine());

Für umgekehrt, das heißt, die QImage von einer Schaffung ROI eines cv :: Mat, würde man die Eigenschaft cv::Mat::step verwenden.

Zum Beispiel:

QImage imageROI(matImageROI.data, matImageROI.cols, matImageROI.rows, matImageROI.step, QImage::Format_Grayscale8);

statt:

QImage imageROI(matImageROI.data, matImageROI.cols, matImageROI.rows, QImage::Format_Grayscale8);

aktualisieren

Für den Fall der ungeraden ROI Größen, obwohl es kein Problem ist, wenn Verwenden Sie entweder imshow() mit cv::Mat oder QImage in QGraphicsScene, wird es ein Problem bei der Verwendung von OpenGL (mit QOpenGLWidget). Ich denke, die einfachste Problemumgehung besteht darin, ROIs so zu beschränken, dass sie gleichmäßige Größen haben.