QT opencv标定结果写入json文件,并解读json内容

使用QT中的QJson类实现 opencv标定结果写入json文件,并解读json内容存入opencv Mat数组

void Widget::makeJsonFile()
{
    QJsonObject rootObj;
    QJsonArray camera_matrixArray;
    QJsonArray camera_distCoeffArray;
//    cout<<"m_matrix:"<<m_cameraMatrix;
//    CvMat cvmat = cvMat(m_cameraMatrix);
//    cout<<"cvMat:"<<cvmat;
    for(int i = 0;i < m_cameraMatrix.rows; i++)
    {
        for(int j = 0; j < m_cameraMatrix.cols; j++)
        {
     //    float a = CV_MAT_ELEM(cvmat,double,i,j);
         camera_matrixArray.append(m_cameraMatrix.at<double>(i,j));
        }
    }
    for(int m = 0; m < m_distCoeffs.rows; m++)
    {
        for(int n = 0; n < m_distCoeffs.cols; n++)
        {
            camera_distCoeffArray.append(m_distCoeffs.at<double>(m,n));
        }
    }
 //   cout<<"m_distCoeffs:"<<m_distCoeffs;
    rootObj.insert("perpixel",m_unit_pixel);
    rootObj.insert("camera_matrix",camera_matrixArray);
    rootObj.insert("camera_distCoeff",camera_distCoeffArray);
    // 将rootObj转换为JSON字符串
    QJsonDocument doc(rootObj);
    QByteArray json = doc.toJson();
//    qDebug()<<"字符串:"<<QString(json).toUtf8().data();

     //将JSON写入到文件
    QFile file("calibrate_result.json");
    file.open(QFile::WriteOnly);
    file.write(json);
    file.close();

}

void Widget::getJsonFile()
{
    //读取文件
    QFile file("calibrate_result.json");
    file.open(QFile::ReadOnly);
    QByteArray json = file.readAll();
    file.close();
    QString matrix = "camera_matrix";
    QString distcoeff = "camera_distCoeff";
    QJsonArray temparry_matrix,temparray_distcoeff;
    QJsonDocument doc = QJsonDocument::fromJson(json);
    //开始解析
    QJsonObject obj = doc.object();
    QStringList keys = obj.keys();
    if(keys.size() <3)
    {
        ui->news_textEdit->append("标定数据读取错误!");
        ui->news_textEdit->moveCursor(QTextCursor::End);//移动光标到最后
        QApplication::processEvents();//这句非常重要,刷新事件QtextEdit控件刷新
        return;
    }
    for(int i = 0;i < keys.size(); i++)
    {
        QString key = keys[i];
        QJsonValue value = obj.value(key);
        if(value.isDouble())
        {
            m_unit_pixel = value.toDouble();//obj["perpixel"].toDouble();
      
        }
        else if(value.isArray())
        {
            if(QString::compare(key,matrix)==0)
            {
                temparry_matrix = value.toArray(); //obj["camera_matrix"].toArray();value.toArray()
              
            }
            if(QString::compare(key,distcoeff) == 0)
            {
                temparray_distcoeff = value.toArray();
            
            }
        }
    }
    int i = 0;
    double temparry1[3][3],temparry2[1][5];
    for(int m = 0;m<3;m++)
    {
        for(int n = 0;n < 3;n++)
        {
        //    m_camera_matrix.at<double>(m,n) = temparry_matrix.at(i).toDouble();
//            qDebug()<<"temparry_matrix.at(i)"<<temparry_matrix.at(i).toDouble();
            temparry1[m][n] = temparry_matrix.at(i).toDouble();
            i++;
        }
    }

    for(int j = 0; j < temparray_distcoeff.size();j++)
    {
      //  m_camera_distCoeff.at<double>(0,j) = temparray_distcoeff.at(j).toDouble();
 //       qDebug()<<"temparray_distcoeff.at(j)"<<temparray_distcoeff.at(j);
        temparry2[0][j] = temparray_distcoeff.at(j).toDouble();
    }

    Mat tempMat1 = Mat(3,3,CV_64FC1,temparry1);//切记一定要用double类型CV_64FC1转换一遍,不能直接赋值,否则出来的值不对。
    Mat tempMat2 = Mat(1,5,CV_64FC1,temparry2);

    tempMat1.convertTo(m_camera_matrix,CV_32FC1);//m_camera_matrix = Mat(3, 3, CV_32FC1, temparry1); /* 摄像机内参数矩阵3*3 */
    tempMat2.convertTo(m_camera_distCoeff,CV_32FC1);//m_camera_distCoeff = Mat(1, 5, CV_32FC1, temparry2); /* 摄像机的5个畸变系数:k1,k2,k3,p1,p2,畸变矩阵1*5,既考虑径向畸变,又考虑切向 */
//    cout<<"m_camera_matrix"<<m_camera_matrix<<endl;
//    cout<<"m_camera_distCoeff"<<m_camera_distCoeff<<endl;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值