我想将图像中的矩形提取到新的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之间的转换。任何解决方案?
答案 0 :(得分:1)
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);