Вы можете просто использовать матрицу преобразования аффинного преобразования (которая предназначена для сдвига пои nts в основном). cv::warpAffine()
с правильной матрицей преобразования сделает трюк.
где: ТХ является сдвиг в изображении оси х, ти является смещение оси изображения у, Каждый пиксель в изображении будет смещена в этом роде.
Вы можете использовать эту функцию, которая возвращает матрицу перевода.(Это, вероятно, не нужно для вас). Но это изменит изображение на основе параметров offsetx
и offsety
.
Mat translateImg(Mat &img, int offsetx, int offsety){
Mat trans_mat = (Mat_<double>(2,3) << 1, 0, offsetx, 0, 1, offsety);
warpAffine(img,img,trans_mat,img.size());
return trans_mat;
}
В вашем случае - вы хотите переместить изображение на 10 пикселей вверх, вы звоните:
translateImg(image,0,-10);
И тогда ваш образ будет смещен, как вы хотите.
Это немного неприятный трюк. Он работает, но есть ненужное создание «нулевого изображения» и копирования. Я верю в свое решение, используя [аффинное преобразование] (http://stackoverflow.com/a/26766505/2740907), более чистая и эффективная. –
@pajus_cz, «нулевое изображение» будет создано в любом случае, даже если вы его не создаете сами. Кроме того, copyTo выполняет простую операцию memcopy, которая намного быстрее, чем все сложные операции, выполняемые wrapAffine. – user2983637
Спасибо! Второй результат быстрее, чем wrapAffine для меня. – dhiga