2016-04-08 26 views
1

QImageでQRectを使用してROIを適切に変換および/または表示できず、QImageからcv :: Matイメージを作成できません。 問題は対称的です。つまり、cv :: Matでcv :: Rectを使用し、MatからQImageを作成してROIを正しく取得できません。意外にも、cv :: RectまたはQRectの幅と高さが等しいときは、すべてうまく動作します。ROIをQImageとの間で変換する方法/ 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間の変換に関する他の問題を探求することで、ストライドは、いくつかの特定のROIサイズで「非標準」になりそうです。からQImageの作成、すなわち他の方法でラウンドのために cv::Mat matImageROI(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, imageROI.bytesPerLine());

、たとえば、this postから、私は1つはちょうど私が代わりで終わる のでcv::Mat tempImage(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, cv::Mat::AUTO_STEP);

imageROI.bytesPerLine()cv::Mat::AUTO_STEPを変更する必要が出ましたcv :: MatのROIは、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()とのいずれかを使用してまたはQImageQGraphicsSceneに設定すると、OpenGL(QOpenGLWidget)を使用すると問題になります。私は、最も簡単な回避策はROIに偶数のサイズを持たせることです。

関連する問題