С моей точки зрения, наиболее «эффективным» способом было бы настроить четыре соответствующие области интереса с помощью cv::Rect
и вручную скопировать содержимое с помощью cv::copyTo
.Возможно, есть также возможность без копирования реального содержимого, просто указав на данные во входных данных cv::Mat
- но, к сожалению, по крайней мере, я не смог их найти.
Тем не менее, вот мой код:
// Shift input image by sx pixels to the left, and sy pixels to the top.
cv::Mat transWrap(cv::Mat& input, const int sx, const int sy)
{
// Get image dimensions.
const int w = input.size().width;
const int h = input.size().height;
// Initialize output with same dimensions and type.
cv::Mat output = cv::Mat(h, w, input.type());
// Copy proper contents manually.
input(cv::Rect(sx, sy, w - sx, h - sy)).copyTo(output(cv::Rect(0, 0, w - sx, h - sy)));
input(cv::Rect(0, sy, sx, h - sy)).copyTo(output(cv::Rect(w - sx, 0, sx, h - sy)));
input(cv::Rect(sx, 0, w - sx, sy)).copyTo(output(cv::Rect(0, h - sy, w - sx, sy)));
input(cv::Rect(0, 0, sx, sy)).copyTo(output(cv::Rect(w - sx, h - sy, sx, sy)));
return output;
}
int main()
{
cv::Mat input = cv::imread("images/tcLUa.jpg", cv::IMREAD_COLOR);
cv::resize(input, input, cv::Size(), 0.25, 0.25);
cv::Mat output = transWrap(input, 300, 150);
return 0;
}
Конечно, код кажется повторяющимся, но, заключенный в собственную функцию, он не будет беспокоить вас в вашем основном коде.; -)
Вывод должен быть таким, чего вы хотите добиться:
Надеюсь, что поможет!