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);
以下のスクリーンショットは、この問題を示しています。
(左)実物大cv::Mat matImage
。QImage
(中央)とから期待される結果QRect
(手で描いた緑色の四角形にほぼ対応)。(右) めちゃくちゃな結果cv::Mat matImageROI