OpenCV cvRemap Cropping Image

后端 未结 1 1356
傲寒
傲寒 2021-02-10 09:25

So I am very new to OpenCV (2.1), so please keep that in mind.

So I managed to calibrate my cheap web camera that I am using (with a wide angle attachme

相关标签:
1条回答
  • 2021-02-10 10:02

    From memory, you need to use InitUndistortRectifyMap(cameraMatrix,distCoeffs,R,newCameraMatrix,map1,map2), of which InitUndistortMap is a simplified version.

    cvInitUndistortMap( intrinsic, distort, map1, map2 )
    

    is equivalent to:

    cvInitUndistortRectifyMap( intrinsic, distort, Identity matrix, intrinsic, 
                               map1, map2 )
    

    The new parameters are R and newCameraMatrix. R species an additional transformation (e.g. rotation) to perform (just set it to the identity matrix).

    The parameter of interest to you is newCameraMatrix. In InitUndistortMap this is the same as the original camera matrix, but you can use it to get that scaling effect you're talking about.

    You get the new camera matrix with GetOptimalNewCameraMatrix(cameraMat, distCoeffs, imageSize, alpha,...). You basically feed in intrinsic, distort, your original image size, and a parameter alpha (along with containers to hold the result matrix, see documentation). The parameter alpha will achieve what you want.

    I quote from the documentation:

    The function computes the optimal new camera matrix based on the free scaling parameter. By varying this parameter the user may retrieve only sensible pixels alpha=0, keep all the original image pixels if there is valuable information in the corners alpha=1, or get something in between. When alpha>0, the undistortion result will likely have some black pixels corresponding to “virtual” pixels outside of the captured distorted image. The original camera matrix, distortion coefficients, the computed new camera matrix and the newImageSize should be passed to InitUndistortRectifyMap to produce the maps for Remap.

    So for the extreme example with all the black bits showing you want alpha=1.

    In summary:

    • call cvGetOptimalNewCameraMatrix with alpha=1 to obtain newCameraMatrix.
    • use cvInitUndistortRectifymap with R being identity matrix and newCameraMatrix set to the one you just calculated
    • feed the new maps into cvRemap.
    0 讨论(0)
提交回复
热议问题