2016-04-08 239 views
1

我無法在QImage中使用QRect正確轉換和/或顯示ROI,並從QImage中創建cv :: Mat圖像。 問題是對稱的,即我無法通過在cv :: Mat中使用cv :: Rect並從Mat創建QImage來正確獲取ROI。令人驚訝的是,每當cv :: Rect或QRect的寬度和高度相等時,一切正常。如何將從/到QImage的ROI轉換爲/從cv :: Mat?

在下面,我的全尺寸圖像是cv :: Mat matImage。這是CV_8U類型的並具有2048×2048的

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

下面的屏幕截圖說明了問題的正方形大小。 (左)全尺寸cv::Mat matImage。 (中)從QImageQRect(其大致對應於手繪的綠色矩形)的預期結果。 (右)在混亂的從cv::Mat matImageROI

+0

我使用Qt 5.6和openCV 3.1,Mac OS X 10.10.5,Macbook Pro Retina。 –

回答

0

通過探索關於cv::MatQImage之間的轉換等問題的結果,似乎步幅成爲一些特定的投資回報率的大小「非標」。例如,從this post,我發現了一個只需要在 cv::Mat tempImage(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, cv::Mat::AUTO_STEP);

所以我最終不是與改變cv::Mat::AUTO_STEPimageROI.bytesPerLine()cv::Mat matImageROI(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, imageROI.bytesPerLine());

對於反過來,即,從創建的QImage cv :: Mat的投資回報率,可以使用屬性cv::Mat::step

例如:的

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

代替:

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

更新

對於奇數ROI大小的情況下,雖然它不是時的問題使用imshow()cv::MatQImage,QGraphicsScene,使用openGL(QOpenGLWidget)時會出現問題。我想最簡單的解決方法就是限制ROI的大小。