我试图将包含在Mat中的较小图像复制到包含在另一个Mat中的另一个较大图像内。
下一个代码是原始垫。
cv::Mat mat(image.height(),image.width()+750,
CV_8UC3,image.bits(), image.bytesPerLine());
那就是我想在上一个垫子中复制的问题:
QImage your_image;
your_image.load(":/Sombrero.png");
your_image = your_image.convertToFormat(
QImage::Format_RGBA8888, Qt::ThresholdDither|Qt::AutoColor);
cv::Mat mat_im(your_image.height(),your_image.width(),CV_8UC3,your_image.bits(),
your_image.bytesPerLine());
如您所见,更改图像的格式,使其与存储在原始图像中的图像相同,但不起作用。
这个问题是不同的,因为我不想像其他问题一样将图像放在普通图像上,我想将图像垫放在另一个垫图像上...。
最佳答案
您可以使用
用Mat(Rect)指定ROI并复制它们。喜欢
Mat big, small;
cv::Rect rect;
small.copyTo(big(Rect));
大垫子和小垫子必须初始化。 Rect必须是小垫子的宽度和高度,x和y是大垫子的原点。
您必须检查垫子的大小(如果较小的垫子适合原点的大垫子),并且垫子的位深应相同。
编辑:
完整的例子
QImage src;
src.load(":/Sombrero.png"); // load to QImage
src = src.convertToFormat(QImage::Format::Format_RGB888); //convert to get sure the format
cv::Mat small(src.height(), src.width(), CV_8UC3, src.scanLine(0)); // convert the QImage to Mat
cv::Mat big(small.rows + 10, small.cols + 10, small.type(), cv::Scalar(0, 0, 0)); // generate a (10,10)px bigger mat
small.copyTo(big(cv::Rect(5, 5, small.cols, small.rows))); // copy the small to the big, you get a 5px black boarder
QImage result = QImage(big.data, big.cols, big.rows, 3 * big.cols, QImage::Format_RGB888); // if you want it back as QImage (3 is the count of channels)