1

QImage で QRect を使用して ROI を適切に変換および/または表示できず、QImage から cv::Mat 画像を作成できません。問題は対称的です。つまり、cv::Mat で cv::Rect を使用し、Mat から QImage を作成しても、ROI を適切に取得できません。驚くべきことに、cv::Rect または QRect の幅と高さが等しい場合は常に、すべてが正常に機能します。

以下では、フルサイズの画像は cv::Mat matImage です。タイプCV_8Uで、正方形のサイズは 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);  

以下のスクリーンショットは、この問題を示しています。

フルサイズとROI (左)実物大cv::Mat matImageQImage(中央)とから期待される結果QRect(手で描いた緑色の四角形にほぼ対応)。(右) めちゃくちゃな結果cv::Mat matImageROI

4

1 に答える 1

0

との間の変換に関する他の問題を調査するcv::MatQImage、特定の ROI サイズでストライドが「非標準」になるようです。たとえば、この投稿cv::Mat::AUTO_STEPから、に変更する必要があることがわかりましimageROI.bytesPerLine()cv::Mat tempImage(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, cv::Mat::AUTO_STEP);

そのため、代わりに次のようになります。 cv::Mat matImageROI(cv::Size(imageROI.width(), imageROI.height()), CV_8UC1, dataBuffer, imageROI.bytesPerLine());

逆に、つまり cv::Mat の ROI から QImage を作成するには、プロパティを使用します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()withcv::MatまたはQImageinを使用する場合は問題ありませんQGraphicsSceneが、openGL ( with を使用する場合QOpenGLWidget) を使用すると問題になります。最も簡単な回避策は、ROI のサイズを均等に制限することだと思います。

于 2016-04-09T09:27:26.637 に答える