使用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;
}