Ich habe eine enge Schleife, in der ich ein Kamerabild bekomme, es nicht entziffern und es auch entsprechend einer Transformation (z. B. einer perspektivischen Transformation) transformiere. Ich habe bereits herausgefunden, cv::remap(...)
für jede Operation zu verwenden, die bereits viel effizienter ist als mit einfachen Matrix-Operationen.Wie kombiniert man zwei Remap() Operationen in einem?
In meinem Verständnis soll es möglich sein, die Lookup-Karten zu einem kombinieren und nur einmal in jedem Schleifendurchlauf neu zuordnen nennen. Gibt es einen kanonischen Weg, dies zu tun? Ich würde es vorziehen, nicht alles Interpolationsmaterial selbst zu implementieren.
Hinweis: Das Verfahren sollte mit Karten unterschiedlicher Größe funktionieren. In meinem speziellen Fall behält die Unverzerrung die Bilddimensionen bei, während die andere Transformation das Bild auf eine andere Größe skaliert.
-Code zur Erläuterung:
// 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);
}
Große Antwort und der Algorithmus funktioniert wie gewünscht für mich. 'img2.cols' sollte wahrscheinlich' dst_width' sagen. Ich werde auch mein Code-Snippet korrigieren, um den Ursprung von 'newCameraMatrix' zu reflektieren. –
@DimitriSchachmann Danke, der Tippfehler wurde korrigiert. – AldurDisciple