У меня есть следующий код для отображения 2 изображений рядом с eachother с небольшим смещением как по размеру x (расстояние), так и по y yreset (yoffset):
void output(Mat left, Mat right) {
Mat imgResult(left.rows + abs(yoffset), right.cols + left.cols + spacing,
left.type());
Mat roiImgResult_Left = imgResult(Rect(0, 0, left.cols, left.rows));
Mat roiImgResult_Right = imgResult(
Rect(left.cols + spacing, 0, right.cols, right.rows+yoffset));
Mat roiImg1 = left(Rect(0, 0, left.cols, left.rows));
Mat roiImg2 = right(Rect(0, 0, right.cols, right.rows+yoffset));
//Mat roiImg = Rect(0,0,spacing,right.rows);
roiImg1.copyTo(roiImgResult_Left); //Img1 will be on the left of imgResult
roiImg2.copyTo(roiImgResult_Right); //Img2 will be on the right of imgResult
resize(imgResult, imgResult, imagesize);
imshow("Final imgage", imgResult);
cv::moveWindow("Final imgage", screenx, screeny);
}
Критической точкой является yoffset, который я, похоже, не могу заставить работать, текущая версия дает
OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in Mat, file /home/thijs/Desktop/opencv-2.4.9/Install-OpenCV/Ubuntu/OpenCV/opencv-2.4.9/modules/core/src/matrix.cpp, line 323
terminate called after throwing an instance of 'cv::Exception'
what(): /home/thijs/Desktop/opencv-2.4.9/Install-OpenCV/Ubuntu/OpenCV/opencv-2.4.9/modules/core/src/matrix.cpp:323: error: (-215) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function Mat
ошибка. Если я удалю +yoffset из Mat roiImg2 = right(Rect(0, 0, right.cols, right.rows+yoffset));
это не даст мне исключения, но получившееся изображение выглядит действительно странно. У кого-нибудь есть опыт?
Так что в несколько immages это то, что делает код:
_______
| | ^ yoffset
|left | ______ v
|______| |right|
|_____|
<-> spacing
все это только в одном окне (не важно, что находится в остальном, так что это просто случайные данные, которые были в памяти).
В этом исключении указано, что указанный ROI охватывает границы изображений.
Я думаю, у вас есть опечатка на этих строках:
Mat roiImgResult_Right = imgResult(Rect(left.cols + spacing, 0, right.cols, right.rows+yoffset));
...
Mat roiImg2 = right(Rect(0, 0, right.cols, right.rows+yoffset));
Предполагая, что yoffset
положителен, вы должны иметь следующее:
Mat roiImgResult_Right = imgResult(Rect(left.cols + spacing, yoffset, right.cols, right.rows));
...
Mat roiImg2 = right(Rect(0, 0, right.cols, right.rows));
Если yoffset
отрицательного yoffset
, соответствующий код будет немного сложнее (так как вам придется обрезать правильное изображение или сдвинуть левый).