Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 不失真失真参数_Opencv_Opencvsharp - Fatal编程技术网

Opencv 不失真失真参数

Opencv 不失真失真参数,opencv,opencvsharp,Opencv,Opencvsharp,我正试图用OpenCV(通过OpenCVSharp的包装器)取消图像的失真,但我很难找到矩阵的正确格式,我正在通过不失真示例中使用的CvFileStorage来改进它们,但是我得到了意想不到的结果 从我使用的另一个软件中,我得到了以下数据(这应该是正确的,因为该软件不干扰iamge,只需使用这些参数即可) 2.5667779156627239e+003 2.5654169232963172e+003 1.2933905910821311e+003 9.6694162774618212e+002

我正试图用OpenCV(通过OpenCVSharp的包装器)取消图像的失真,但我很难找到矩阵的正确格式,我正在通过不失真示例中使用的CvFileStorage来改进它们,但是我得到了意想不到的结果

从我使用的另一个软件中,我得到了以下数据(这应该是正确的,因为该软件不干扰iamge,只需使用这些参数即可)


2.5667779156627239e+003
2.5654169232963172e+003
1.2933905910821311e+003
9.6694162774618212e+002
2.9824815660771562e+000
9.1041365324307497e-002
-4.0485507081497402e-001
3.3943759073230600e-001
3.4409596859645629e-004
-3.947265205829605E-005
我正在使用下面的代码来消除图像的失真,内部矩阵很好(在应用无失真时给出预期结果),但是失真矩阵给我带来了问题,从我对预期布局的理解来看(没有找到任何示例,但这是我从OpenCV源代码收集的)带有k1k2p1p2的4X1矩阵应该可以工作,因此我的配置文件中有:

<?xml version="1.0"?>
<opencv_storage>
   <intrinsic type_id="opencv-matrix">
   <rows>3</rows>
   <cols>3</cols>
   <dt>f</dt>
   <data>
      1293.3905910821311 0. 966.94162774618212 0. 2566.7779156627239 2565.4169232963172 0. 0. 1.
   </data>
 </intrinsic>
 <distortion type_id="opencv-matrix">
   <rows>1</rows>
   <cols>5</cols>
   <dt>f</dt>
   <data>
  0.091041365324307497 -0.40485507081497402 0.00034409596859645629 -0.000039472652058529605 0.33943759073230600
   </data>
 </distortion>

3.
3.
F
1293.3905910821311 0. 966.94162774618212 0. 2566.7779156627239 2565.4169232963172 0. 01.
1.
5.
F
0.091041365324307497 -0.40485507081497402 0.00034409596859645629 -0.000039472652058529605 0.33943759073230600

代码:

            using (IplImage srcImg = new IplImage(img.Path, LoadMode.Color))
            using (IplImage dstImg = srcImg.Clone())
            {
                CvMat intrinsic, distortion;
                using (CvFileStorage fs = new CvFileStorage("camera.xml", null, FileStorageMode.Read))
                {
                    CvFileNode param = fs.GetFileNodeByName(null, "intrinsic");
                    intrinsic = fs.Read<CvMat>(param);
                    param = fs.GetFileNodeByName(null, "distortion");
                    distortion = fs.Read<CvMat>(param);
                }
                Cv.Undistort2(srcImg, dstImg, intrinsic, distortion);
                dstImg.SaveImage(new System.IO.FileInfo(img.Path).Name);
            }
使用(IplImage srcImg=new-IplImage(img.Path,LoadMode.Color))
使用(IplImage dstImg=srcImg.Clone())
{
CvMat固有失真;
使用(CvFileStorage fs=new-CvFileStorage(“camera.xml”,null,FileStorageMode.Read))
{
CvFileNode param=fs.GetFileNodeByName(null,“固有”);
内在=fs.Read(参数);
param=fs.GetFileNodeByName(null,“失真”);
失真=fs.Read(参数);
}
Cv.不失真2(srcImg、dstImg、固有、失真);
dstImg.SaveImage(newsystem.IO.FileInfo(img.Path.Name);
}

然而,我得到了完全扭曲的图像(漩涡),我的矩阵顺序是错误的吗?是否有任何代码样本(我找不到任何)具有由命名参数构造的矩阵(我找到的只是一个使用样本文件的样本,其中包含一个矩阵,并且没有关于组件订单的文档)?

因为您得到的校准是针对五个参数
k1、k2、k3、p1,p2
那么您应该使用所有这些参数进行不失真。 当前您正在跳过k3

尝试将
k3
的值添加到配置文件中,以使
失真
参数具有尺寸
1x5

请注意,顺序应为
k1、k2、p1、p2、k3

不确定
skew
参数,但此代码给出的结果与您提供的图像完全不同(但它也不等于您的“正确”校正图像)

intmain()
{
//摄像机分辨率
cv::Mat input=cv::imread(“../inputData/textured1.jpg”);
cv::Mat Distcoff;
distCoeff=cv::Mat::zeros(8,1,cv_64FC1);
//指数:k1、k2、p1、p2、k3、k4、k5、k6
//你的系数在这里!
双k1=9.1041365324307497e-002;
双k2=-4.0485507081497402e-001;
双p1=3.4409596859645629e-004;
双p2=-3.947265205829605E-005;
双k3=3.3943759073230600e-001;
双k4=0;
双k5=0;
双k6=0;
(0,0)处的距离系数=k1;
(1,0)处的距离系数=k2;
(2,0)处的距离系数=p1;
(3,0)处的距离系数=p2;
(4,0)处的距离系数=k3;
(5,0)处的距离系数=k4;
(6,0)处的距离系数=k5;
(7,0)处的距离系数=k6;
//相机本质
cv::Mat cam1;
cam1=cv::Mat::eye(3,3,cv_32FC1);
cam1.at(0,0)=2.5667779156627239e+003;
//cam1.at(0,1)=0;
cam1.at(0,1)=2.9824815660771562e+000;//歪斜?
cam1.at(0,2)=1.2933905910821311e+003;
cam1.at(1,0)=0;
cam1.at(1,1)=2.5654169232963172e+003;
cam1.at(1,2)=9.6694162774618212e+002;
//直接不失真:
cv::Mat输出;
cv::不失真(输入、输出、cam1、DISTCOFF);
cv::imshow(“输入”,输入);
cv::imshow(“distCorr direct”,输出);
cv::waitKey(-1);
返回0;
}

这修复了漩涡效应,但我仍然认为我有其他错误,因为它与预期输出不同,我将用3张照片(未失真、失真和我错误的未失真版本)更新OP。我认为这样做会更容易,因为这是一个视觉问题。请确保发布内部信息,因为这样我们就可以测试它了。我添加了完整的示例文件,在一分钟内上传图片也添加了示例图片:打印
固有
失真
的值,以确保您阅读它们正常。@ChronoTrigger OpenCV直接从它自己的xml文件格式中读取它们,所以我认为没有问题,您希望我在代码中的哪一步读取并显示它们?我会用这些信息来更新OP,但我不知道该在哪里做。你的内在逻辑顺序正确吗?看起来你在给他们提供镜像和转置之类的东西。?请尝试
2566.7779156627239 2.9824815660771562 1293.3905910821311 0 2565.4169232963172 966.94162774618212 0 0 1
please@Micka啊,就是这样!非常感谢您对失真矩阵的浏览:{CvMat(Rows=8,Cols=1)00910413653243075-04048507814974 000034095968596456-3947265205896E-05 0339437590732306 0}和内在的:{CvMat(Rows=3,Cols=3)1293390625 0 966941650625 0 2566773203125 25654169925 0 1870 0 0}所以您的本质不同。。。您提供
cx,0,cy,0,fx,fy,0,
            using (IplImage srcImg = new IplImage(img.Path, LoadMode.Color))
            using (IplImage dstImg = srcImg.Clone())
            {
                CvMat intrinsic, distortion;
                using (CvFileStorage fs = new CvFileStorage("camera.xml", null, FileStorageMode.Read))
                {
                    CvFileNode param = fs.GetFileNodeByName(null, "intrinsic");
                    intrinsic = fs.Read<CvMat>(param);
                    param = fs.GetFileNodeByName(null, "distortion");
                    distortion = fs.Read<CvMat>(param);
                }
                Cv.Undistort2(srcImg, dstImg, intrinsic, distortion);
                dstImg.SaveImage(new System.IO.FileInfo(img.Path).Name);
            }
int main()
{
    // camera resolution
    cv::Mat input= cv::imread("../inputData/distorted1.jpg");


    cv::Mat distCoeff;
    distCoeff = cv::Mat::zeros(8,1,CV_64FC1);

    // indices: k1, k2, p1, p2, k3, k4, k5, k6 
    // your coefficients here!
    double k1 = 9.1041365324307497e-002;
    double k2 = -4.0485507081497402e-001;
    double p1 = 3.4409596859645629e-004;
    double p2 = -3.9472652058529605e-005;
    double k3 = 3.3943759073230600e-001;
    double k4 = 0;
    double k5 = 0;
    double k6 = 0;

    distCoeff.at<double>(0,0) = k1;
    distCoeff.at<double>(1,0) = k2;
    distCoeff.at<double>(2,0) = p1;
    distCoeff.at<double>(3,0) = p2;
    distCoeff.at<double>(4,0) = k3;
    distCoeff.at<double>(5,0) = k4;
    distCoeff.at<double>(6,0) = k5;
    distCoeff.at<double>(7,0) = k6;


    // camera intrinsics
    cv::Mat cam1;
    cam1 = cv::Mat::eye(3,3,CV_32FC1);
    cam1.at<float>(0,0) = 2.5667779156627239e+003;
    //cam1.at<float>(0,1) = 0;
    cam1.at<float>(0,1) = 2.9824815660771562e+000; // skew?
    cam1.at<float>(0,2) = 1.2933905910821311e+003;

    cam1.at<float>(1,0) = 0;
    cam1.at<float>(1,1) = 2.5654169232963172e+003;
    cam1.at<float>(1,2) = 9.6694162774618212e+002;

    // direct undistort:
    cv::Mat output;
    cv::undistort(input, output, cam1,distCoeff);


    cv::imshow("input", input);
    cv::imshow("distCorr-direct", output);

    cv::waitKey(-1);

    return 0;
}