gpt4 book ai didi

c++ - OpenCV鱼眼校准C++输出与Python不同

转载 作者:行者123 更新时间:2023-12-02 17:02:26 31 4
gpt4 key购买 nike

我目前正在使用具有鱼眼镜头(虽然不多,但仍然是鱼眼镜头)的相机,并且正在尝试使其失真。

首先:我对opencv并不熟悉,但是我总是想在文档上尝试做任何事情。 (和/或在这里寻找我的问题的答案)。

因此,我在网络上看到很少的示例,我尝试了解决方案,并得到了一些结果。

在这里,我发现了:

DIM=(1094, 729)
K=np.array([
[1307.2807020496643, 0.0, 530.3754311563506],
[0.0, 1318.342691460933, 354.98352268131123],
[0.0, 0.0, 1.0]
])
D=np.array([
[-0.2994762856767568],
[0.5036082961388784],
[-4.231072729639434],
[3.8646397788794578]
])
def undistort(img_path):
img = cv2.imread(img_path)
h,w = img.shape[:2]
print(K)
print(D)
print(np.eye(3))
print(DIM)
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, DIM, cv2.CV_16SC2)

undistorted_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
cv2.imshow("undistorted", undistorted_img)
cv2.imwrite("test.jpg", undistorted_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

if __name__ == '__main__':
for p in sys.argv[1:]:
undistort(p)

这是我用来扭曲图像的python脚本。顶部的数据(K和D)是通过另一个脚本生成的。我没有提到它,因为我在C++中进行了翻译,对于相同的base_picture显示相同的结果

对于此功能,如果我给出失真的图像,例如:
Python distorted image
我得到了这个结果:
Python undistorted image

因此,我可以看到微小的失真已解决。

但是,当我尝试在C++中实现相同的功能时,如下所示:
src = cv::imread(“path/to/image.jpg");

cv::Size size = {src.cols, src.rows};

cv::Mat K(3, 3, cv::DataType<double>::type);
K.at<double>(0, 0) = 1307.2807020496643;
K.at<double>(0, 1) = 0.0;
K.at<double>(0, 2) = 530.3754311563506;

K.at<double>(1, 0) = 0.0;
K.at<double>(1, 1) = 1318.342691460933;
K.at<double>(1, 2) = 354.98352268131123;

K.at<double>(2, 0) = 0.0;
K.at<double>(2, 1) = 0.0;
K.at<double>(2, 2) = 1.0;

cv::Mat D(4, 1, cv::DataType<double>::type);
D.at<double>(0, 0) = -0.2994762856767568;
D.at<double>(1, 0) = 0.5036082961388784;
D.at<double>(2, 0) = -4.231072729639434;
D.at<double>(3, 0) = 3.8646397788794578;
cv::Mat E = cv::Mat::eye(3, 3, cv::DataType<double>::type);

cv::Mat map1;
cv::Mat map2;

std::cout << K << std::endl;
std::cout << D << std::endl;
std::cout << E << std::endl;
std::cout << size << std::endl;

cv::initUndistortRectifyMap(K, D, E, K, size, CV_16SC2, map1, map2);

cv::Mat undistort;
cv::remap(src, undistort, map1, map2, CV_INTER_LINEAR,
CV_HAL_BORDER_CONSTANT);

基本图像仍然与我得到的结果相同:
C++ undistorted image

如您所知,情况变得更糟…

我在我的python脚本和c++程序中转储了K,D和E(对于相同的基本图片都给出了相同的结果)(我的意思是当我计算数据时)

从initUndistortRectifyMap到重新映射都是错误的,最后imshow完全不是我所期望的。

我尝试将python1和map2转储到python脚本和C++程序中(没有查看所有数据),但我注意到,在其中一张 map 的末尾(两者都不看),结果是不同的。

由于我使用相同的参数(据我所知)调用该函数,因此我希望两个程序之间的映射相等。

我在做错什么吗?喜欢弄乱类型还是什么?

从cv::imread或从摄像机的帧获取中计算图像是否会有所改变?

(只是让您知道,用于进行计算的帧(.jpg)是从摄像机的帧获取中获取的cv::imwrite,因此我打算不再使用图像,而仅在填充了cv::Mat的情况下使用包含来自摄像头采集的数据。)

(我知道最后的枚举并不相同,但是即使使用 cv::BORDER_CONSTANT,我仍然遇到相同的问题。)

最佳答案

您使用了cv::initUndistortRectifyMap而不是cv::fisheye::initUndistortRectifyMap
使用此代码,我得到正确的结果:

int main()
{
cv::Mat src = cv::imread("C:/StackOverflow/Input/fisheyeCalib.jpg");

cv::Size size = { src.cols, src.rows };

cv::Mat K(3, 3, cv::DataType<double>::type);
K.at<double>(0, 0) = 1307.2807020496643;
K.at<double>(0, 1) = 0.0;
K.at<double>(0, 2) = 530.3754311563506;

K.at<double>(1, 0) = 0.0;
K.at<double>(1, 1) = 1318.342691460933;
K.at<double>(1, 2) = 354.98352268131123;

K.at<double>(2, 0) = 0.0;
K.at<double>(2, 1) = 0.0;
K.at<double>(2, 2) = 1.0;

cv::Mat D(4, 1, cv::DataType<double>::type);
D.at<double>(0, 0) = -0.2994762856767568;
D.at<double>(1, 0) = 0.5036082961388784;
D.at<double>(2, 0) = -4.231072729639434;
D.at<double>(3, 0) = 3.8646397788794578;
cv::Mat E = cv::Mat::eye(3, 3, cv::DataType<double>::type);

cv::Mat map1;
cv::Mat map2;

std::cout << K << std::endl;
std::cout << D << std::endl;
std::cout << E << std::endl;
std::cout << size << std::endl;

// Here's the error:
//cv::initUndistortRectifyMap(K, D, E, K, size, CV_16SC2, map1, map2);
cv::fisheye::initUndistortRectifyMap(K, D, E, K, size, CV_16SC2, map1, map2);

cv::Mat undistort;
cv::remap(src, undistort, map1, map2, CV_INTER_LINEAR,
CV_HAL_BORDER_CONSTANT);

cv::imwrite("C:/StackOverflow/Input/fisheyeCalib_output.jpg", undistort);
cv::imshow("undist", undistort);
cv::waitKey(0);
}

enter image description here

关于c++ - OpenCV鱼眼校准C++输出与Python不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60117784/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com