OpenCv: перевести изображение, обернуть пиксели вокруг краев (C ++) - PullRequest
4 голосов
/ 26 сентября 2019

Я пытаюсь перевести изображение по горизонтали на x пикселей и вертикально на y пикселей, поэтому.Однако я хочу, чтобы пиксели были обернуты по краям.В основном ...

мы начинаем с изображения один ...

смещение на х пикселей ...

и смещение на y пикселей ...

Насколько я знаю, функция warpAffine () OpenCv не способна это сделать.Обычно, я бы просто проходил по изображению и сдвигал пиксели на определенную величину, но при этом я мог смещать их только горизонтально.Какой самый эффективный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

С моей точки зрения, наиболее «эффективным» способом было бы настроить четыре соответствующие области интереса с помощью 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;
}

Конечно, код кажется повторяющимся, но, заключенный в собственную функцию, он не будет беспокоить вас в вашем основном коде.; -)

Вывод должен быть таким, чего вы хотите добиться:

Output

Надеюсь, что поможет!

3 голосов
/ 26 сентября 2019

Вы можете использовать np.roll()

image

Вот визуализация

image

Я реализовалэто в Python, но вы можете применить аналогичную технику прокатки в C ++

import cv2
import numpy as np

image = cv2.imread('1.jpg')

shift_x = 800
shift_y = 650

# Shift by x-axis
for i in range(image.shape[1] -1, shift_x, -1):
    image = np.roll(image, -1, axis=1)
    image[:, -1] = image[:, 0]
    cv2.imshow('image', image)
    cv2.waitKey(1)

# Shift by y-axis
for i in range(image.shape[1] -1, shift_y, -1):
    image = np.roll(image, -1, axis=0)
    image[:, -1] = image[:, 0]
    cv2.imshow('image', image)
    cv2.waitKey(1)

cv2.imshow('image', image)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...