O objetivo desta atividade é observar como podemos utilizar de ferramentas computacionais da biblioteca OpenCV para modificar a imagem, cortando-a em pedaços e movendo esses pedaços para outros lugares pré-destinados. Para isso, uma imagem será dividida em 4 regiões, e essas regiões serão trocadas diagonalmente.

Desenvolvimento da atividade

A imagem a ser processada é a seguinte:

960
Figura 1. Garnet and Stevonnie (Imagem original)

E após executar o programa, o resultado desejado é o seguinte:

960
Figura 2. Garnet and Stevonnie (Regiões Trocadas)

Código no OpenCV

A priori, fora necessário o uso de funções do OpenCV, como o "Rect" e o "CopyTo". A ideia é simples, o programa "divide" a imagem em 4 partes e realiza a troca de regiões, armazenando o resultado em uma nova imagem. Aqui, podemos perceber que trocamos da seguinte forma: quadrante superior esquerdo com o quadrante inferior direito e quadrante superior direito com o quadrante inferior esquerdo.

Listagem 1. trocaregiao.cpp
#include <iostream>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

int main(int, char**){
  Mat image;
  int larg, alt;

  image = imread("mindful.png",CV_LOAD_IMAGE_COLOR);
	if(!image.data)
    cout << "A imagem não pôde ser carregada ou está corrompida." << endl;

  larg=image.size().width;
  alt=image.size().height;

  Mat troca(alt, larg, image.type());							//Criação da matriz que receberá a imagem com as regiões trocadas

  image(Rect(0, 0, larg/2, alt/2)).copyTo(troca(Rect(larg/2, alt/2, larg/2, alt/2)));	//A partir da imagem retangular na região superior esquerda, realiza a cópia para a imagem resultante na posição inferior direita

  image(Rect(0, alt/2, larg/2, alt/2)).copyTo(troca(Rect(larg/2,0, larg/2, alt/2)));	//A partir da imagem retangular na região inferior esquerda, realiza a cópia para a imagem resultante na posição superior direita

  image(Rect(larg/2,0,larg/2,alt/2)).copyTo(troca(Rect(0,alt/2, larg/2, alt/2)));	//A partir da imagem retangular na região superior direita, realiza a cópia para a imagem resultante na posição inferior esquerda

  image(Rect(larg/2,alt/2,larg/2,alt/2)).copyTo(troca(Rect(0,0, larg/2, alt/2)));	//A partir da imagem retangular na região inferior direita, realiza a cópia para a imagem resultante na posição superior esquerda

  imwrite("trocatroca.png", troca);
  imshow("image", troca);
  waitKey();
  return 0;
}

O resultado da execução do programa pode ser observado na imagem Garnet and Stevonnie (Regiões Trocadas).