Извлеките прямоугольник в новый мат и конвертируйте в растровое изображение - PullRequest
0 голосов
/ 06 июня 2018

Я хочу извлечь прямоугольник на изображении в новый Mat () и заполнить его этим ROI.Я пытался, но после преобразования Mat в Bitmap изображение повреждено.

OpenCV.Core.Rect ROI = new OpenCV.Core.Rect(leftX, leftTopY, 600, 200);
Mat croppedImage = new Mat(digitsMask, ROI);
digitsMask.CopyTo(croppedImage);

Выше приведен код для извлечения ROI для нового Mat.

Utils.BitmapToMat(bitmap, imageMat);
cuttedImage = FilterBitmap(imageMat);
Bitmap newBitmap = Bitmap.CreateBitmap((int)cuttedImage.Size().Width, (int)cuttedImage.Size().Height, Bitmap.Config.Argb8888);
Utils.MatToBitmap(cuttedImage, newBitmap);

Вот преобразование между Mat и Bitmap.Любые решения?

Here is image after draw Rectangle, whitch i want to extract

1 Ответ

0 голосов
/ 06 июня 2018

Функция copyTo перераспределяет матрицу назначения перед копированием в нее данных.Чтобы сделать глубокую копию, используйте clone.

Отказ от ответственности: Это непроверенный код.

// create ROI
OpenCV.Core.Rect ROI = new OpenCV.Core.Rect(leftX, leftTopY, 600, 200);
// deep copy ROI to new image
Mat croppedImage = (new Mat(digitsMask, ROI)).clone();
// create bitmap
Bitmap bmp = null;
// create a new 4 channel Mat because bitmap is ARGB
Mat tmp = new Mat (croppedImage.rows(), croppedImage.cols(), CvType.CV_8U, new Scalar(4));
// convert ROI image from single channel to 4 channel
Imgproc.cvtColor(croppedImage, tmp, Imgproc.COLOR_GRAY2RGBA, 4);
// Initialize bitmap
bmp = Bitmap.createBitmap(croppedImage.cols(), croppedImage.rows(), Bitmap.Config.ARGB_8888);
// convert Mat to bitmap
Utils.matToBitmap(tmp, bmp);
...