Ho un circuito chiuso, dove ottengo un'immagine della telecamera, non la distorco e la trasformo anche in base a qualche trasformazione (ad esempio una trasformazione prospettica). Ho già capito di utilizzare cv::remap(...)
per ogni operazione, che è già molto più efficiente rispetto all'utilizzo di operazioni con matrice semplice.Come combinare due operazioni rimappa() in una?
A mio parere, dovrebbe essere possibile combinare le mappe di ricerca in una e richiamare la correzione una sola volta in ogni ciclo iterativo. C'è un modo canonico per fare questo? Preferirei non implementare tutte le cose di interpolazione da solo.
Nota: la procedura dovrebbe funzionare con mappe di dimensioni diverse. Nel mio caso particolare la distorsione conserva le dimensioni dell'immagine, mentre l'altra trasformazione scala l'immagine in una dimensione diversa.
Codice per l'illustrazione:
// input arguments
const cv::Mat_<math::flt> intrinsic = getIntrinsic();
const cv::Mat_<math::flt> distortion = getDistortion();
const cv::Mat mNewCameraMatrix = cv::getOptimalNewCameraMatrix(intrinsic, distortion, myImageSize, 0);
// output arguments
cv::Mat undistortMapX;
cv::Mat undistortMapY;
// computes undistortion maps
cv::initUndistortRectifyMap(intrinsic, distortion, cv::Mat(),
newCameraMatrix, myImageSize, CV_16SC2,
undistortMapX, undistortMapY);
// computes undistortion maps
// ...computation of mapX and mapY omitted
cv::convertMaps(mapX, mapY, skewMapX, skewMapY, CV_16SC2);
for(;;) {
cv::Mat originalImage = getNewImage();
cv::Mat undistortedImage;
cv::remap(originalImage, undistortedImage, undistortMapX, undistortMapY, cv::INTER_LINEAR);
cv::Mat skewedImage;
cv::remap(undistortedImage, skewedImage, skewMapX, skewMapY, cv::INTER_LINEAR);
outputImage(skewedImage);
}
Ottima risposta e l'algoritmo funziona come desiderato per me. 'img2.cols' probabilmente dovrebbe dire' dst_width'. Correggerò anche il mio snippet di codice per riflettere l'origine di 'newCameraMatrix'. –
@DimitriSchachmann Grazie, l'errore di battitura è stato corretto. – AldurDisciple