Ecco una funzione che ho scritto, in base alla risposta del Zaw Lin, di fare telaio/spostamento dell'immagine in qualsiasi direzione per qualsiasi quantità di pixel righe o colonne:
enum Direction{
ShiftUp=1, ShiftRight, ShiftDown, ShiftLeft
};
cv::Mat shiftFrame(cv::Mat frame, int pixels, Direction direction)
{
//create a same sized temporary Mat with all the pixels flagged as invalid (-1)
cv::Mat temp = cv::Mat::zeros(frame.size(), frame.type());
switch (direction)
{
case(ShiftUp) :
frame(cv::Rect(0, pixels, frame.cols, frame.rows - pixels)).copyTo(temp(cv::Rect(0, 0, temp.cols, temp.rows - pixels)));
break;
case(ShiftRight) :
frame(cv::Rect(0, 0, frame.cols - pixels, frame.rows)).copyTo(temp(cv::Rect(pixels, 0, frame.cols - pixels, frame.rows)));
break;
case(ShiftDown) :
frame(cv::Rect(0, 0, frame.cols, frame.rows - pixels)).copyTo(temp(cv::Rect(0, pixels, frame.cols, frame.rows - pixels)));
break;
case(ShiftLeft) :
frame(cv::Rect(pixels, 0, frame.cols - pixels, frame.rows)).copyTo(temp(cv::Rect(0, 0, frame.cols - pixels, frame.rows)));
break;
default:
std::cout << "Shift direction is not set properly" << std::endl;
}
return temp;
}
fonte
2014-02-16 16:16:32
Questo è un trucco un po 'sgradevole. Funziona, ma non è necessario creare "zero image" e copiare. Credo che la mia soluzione con [trasformazione affine] (http://stackoverflow.com/a/26766505/2740907) sia più pulita e prestazioni migliori. –
@pajus_cz, "zero image" verrà creato in entrambi i casi, anche se non lo si sta creando da soli. Inoltre, copyTo esegue un'operazione di memcopy semplice molto più veloce di tutte le operazioni complesse eseguite da wrapAffine. – user2983637
Grazie! Il secondo risultato è più veloce di wrapAffine per me. – dhiga