Ruota cv :: Mat usando cv :: warpAffine sposta l’immagine di destinazione

Sto provando a ruotare un’immagine di 1296×968 di 90 gradi usando l’ API C ++ di OpenCV e sto affrontando alcuni problemi.

Input : ingresso

Ruotato : produzione

Come puoi vedere, l’immagine ruotata presenta alcuni problemi. Innanzitutto, ha le stesse dimensioni dell’originale, anche se creo specificamente il Mat destinazione con la dimensione invertita dell’originale. Di conseguenza, l’immagine di destinazione viene ritagliata.

Sospetto che stia succedendo perché sto chiamando warpAffine() e passando le dimensioni del Mat originale invece delle dimensioni del Mat di destinazione. Ma lo sto facendo perché ho seguito questa risposta , ma ora sospetto che la risposta potrebbe essere sbagliata. Quindi questo è il mio primo dubbio / problema.

Il secondo è che warpAffine() sta scrivendo sulla destinazione con un determinato offset (probabilmente per copiare i dati ruotati al centro dell’immagine) e questa operazione lascia un bordo nero orribile e grande attorno all’immagine.

Come posso risolvere questi problemi?

Sto condividendo il codice sorgente qui sotto:

 #include  #include  #include  using namespace cv; using namespace std; void rotate(Mat& image, double angle) { Point2f src_center(image.cols/2.0F, image.rows/2.0F); Mat rot_matrix = getRotationMatrix2D(src_center, angle, 1.0); Mat rotated_img(Size(image.size().height, image.size().width), image.type()); warpAffine(image, rotated_img, rot_matrix, image.size()); imwrite("rotated.jpg", rotated_img); } int main(int argc, char* argv[]) { Mat orig_image = imread(argv[1], 1); if (orig_image.empty()) { cout << "!!! Couldn't load " << argv[1] << endl; return -1; } rotate(orig_image, 90); return 0; }