tinyxml学习笔记——以读取smart3D空三文件为例


/*  UTF-8格式转GB2312格式,用于中文字符的读取*/
char* U2G(const char* utf8)
{
    int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[len + 1];
    memset(wstr, 0, len + 1);
    MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
    len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* str = new char[len + 1];
    memset(str, 0, len + 1);
    WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
    if (wstr) delete[] wstr;
    return str;
}

//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
    int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[len + 1];
    memset(wstr, 0, len + 1);
    MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
    len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* str = new char[len + 1];
    memset(str, 0, len + 1);
    WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
    if (wstr) delete[] wstr;
    return str;
}

int main(int argc, char* argv[])
{
    if (argc < 2) {
        std::cout << "USAGE: (Block**** - AT - export undistorted photos) folder" << std::endl;
        return -1;
    }
    
    std::string output_folder = "F:\\MVS_projects\\ISPRS\\rathaus\\rathaus_cc\\Block_5 - AT - export undistorted photos";
    std::string camera_folder = output_folder + "/smart3D空三相机外参";
    std::string images_folder = output_folder + "/smart3D转ACMP的无畸变影像";
    std::string ply_path = output_folder + "/smart3D特征点云.ply";
    std::string georegis_path = output_folder + "/geo_registered.txt";

    //std::string result_folder = result_path.str();
    //_mkdir(result_folder.c_str());  //#include"direct.h"
    std::vector<PointPLY> PointCloud;
    PointCloud.clear();
    if (_access(georegis_path.c_str(), 0) == 0)//文件存在
    {
        if (remove(georegis_path.c_str()) == 0)
        {
            std::cout << georegis_path << "已删除" << std::endl;
        }
    }

    TiXmlDocument* myDocument = new TiXmlDocument();
    myDocument->LoadFile("F:\\MVS_projects\\ISPRS\\rathaus\\rathaus_cc\\Block_5 - AT - final - export.xml");  
    TiXmlElement* rootElement = myDocument->RootElement();  //获取根节点  BlocksExchange
    cout << rootElement->Value() << endl;
    TiXmlHandle hRoot(rootElement);     // hRoot是根节点
    TiXmlElement* nodeElem = hRoot.FirstChild("Block").Element();
    cout << nodeElem->Value() << endl;  // Block
    TiXmlElement* PhotogroupElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").Element();
    cout << PhotogroupElem->Value() << endl;  // Photogroup
    TiXmlElement* ImageDimensionsElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("ImageDimensions").Element();
    cout << ImageDimensionsElem->Value() << endl;  // ImageDimensions
    TiXmlElement* WidthElem = ImageDimensionsElem->FirstChild("Width")->ToElement();
    cout << WidthElem->Value() << ": " << WidthElem->GetText() << std::endl;  //Width
    TiXmlElement* HeightElem = ImageDimensionsElem->FirstChild("Height")->ToElement();
    cout << HeightElem->Value() << ": " << HeightElem->GetText() << std::endl;  //Height
    TiXmlElement* FocalLengthElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("FocalLength").Element();
    cout << FocalLengthElem->Value() << ": " << FocalLengthElem->GetText() << std::endl;  //Focallength
    TiXmlElement* SensorSizeElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("SensorSize").Element();
    cout << SensorSizeElem->Value() << ": " << SensorSizeElem->GetText() << std::endl; //SensorSize
    TiXmlElement* PhotoElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("Photo").Element();
    cout << PhotoElem->Value() << endl;  // Photo

    string lines;
    stringstream ss;
    double value;
    // 相机属性
    vector<double>  R, C;
    int image_id;
    double neardepth, fardepth;
    double width, height, focal_mm, sensorsize, fxy;
    // 点云属性
    PointPLY tmpPoint;
    double xyz, rgb;
    vector<Image> ImageList;
    ImageList.clear();

    ss.clear();
    ss.str(WidthElem->GetText());
    ss >> width;
    ss.clear();
    ss.str(HeightElem->GetText());
    ss >> height;
    ss.clear();
    ss.str(FocalLengthElem->GetText());
    ss >> focal_mm;
    ss.clear();
    ss.str(SensorSizeElem->GetText());
    ss >> sensorsize;
    fxy = focal_mm * width / sensorsize;

    while (PhotoElem) {
        R.clear();
        C.clear();
        TiXmlElement* IdElement = PhotoElem->FirstChild("Id")->ToElement();
        std::cout << "Image_Id" << " : " << IdElement->GetText() << std::endl;
        ss.clear();
        ss.str(IdElement->GetText());
        ss >> image_id;
        TiXmlElement* ImagePathElement = PhotoElem->FirstChild("ImagePath")->ToElement();
        std::cout << "ImagePath" << " : " << U2G(ImagePathElement->GetText()) << std::endl;
        string image_name = U2G(ImagePathElement->GetText());
        image_name = image_name.substr(image_name.find_last_of('\\') + 1);
        cout << image_name << endl;  //  IMG_2868.jpg

        Image img;
        img.ID = image_id;
        img.name = image_name;
        ImageList.emplace_back(img);

        TiXmlElement* RotationElement = PhotoElem->FirstChild("Pose")->FirstChild("Rotation")->ToElement();
        TiXmlElement* CenterElement = PhotoElem->FirstChild("Pose")->FirstChild("Center")->ToElement();
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                string M_ = "M_" + std::to_string(i) + std::to_string(j);
                TiXmlElement* M_Element = RotationElement->FirstChild(M_.data())->ToElement();
                std::cout << M_ << ": " << M_Element->GetText() << std::endl;
                lines = M_Element->GetText();
                ss.clear();
                ss.str(lines);  // include<sstream>
                ss >> value;
                R.emplace_back(value);
            }
        }
        TiXmlElement* C_Element = CenterElement->FirstChild("x")->ToElement();
        std::cout << " x : " << C_Element->GetText() << std::endl;
        ss.clear();
        ss.str(C_Element->GetText());
        ss >> value;
        C.emplace_back(value);
        C_Element = CenterElement->FirstChild("y")->ToElement();
        std::cout << " y : " << C_Element->GetText() << std::endl;
        ss.clear();
        ss.str(C_Element->GetText());
        ss >> value;
        C.emplace_back(value);
        C_Element = CenterElement->FirstChild("z")->ToElement();
        std::cout << " z : " << C_Element->GetText() << std::endl;
        ss.clear();
        ss.str(C_Element->GetText());
        ss >> value;
        C.emplace_back(value);
        TiXmlElement* NearDepthElement = PhotoElem->FirstChild("NearDepth")->ToElement();
        std::cout << " NearDepth: " << NearDepthElement->GetText() << std::endl;
        ss.clear();
        ss.str(NearDepthElement->GetText());
        ss >> neardepth;
        TiXmlElement* FarDepthElement = PhotoElem->FirstChild("FarDepth")->ToElement();
        std::cout << " FarDepth: " << FarDepthElement->GetText() << std::endl;
        ss.clear();
        ss.str(FarDepthElement->GetText());
        ss >> fardepth;
        std::cout << std::endl;

        Outputgeotxt(georegis_path, image_name, C);
        OutputCam(camera_folder, image_id, R, C, neardepth, fardepth, width, height, fxy);
        PhotoElem = PhotoElem->NextSiblingElement();  // Photo紧挨着Photo
    }
    //if (_access(images_folder.c_str(), 0) != 0) {//文件存在
    //    _mkdir(images_folder.c_str());
    //    jpg2jpg(output_folder, images_folder, ImageList);
    //}

    int max = 1000;
    TiXmlElement* TiePointElem = hRoot.FirstChild("Block").FirstChild("TiePoints").FirstChild("TiePoint").Element();
    cout << "开始读取" << TiePointElem->Value() << endl;  // TiePoint
    while (TiePointElem) {
        //读取连接点的坐标 XYZ
        TiXmlElement* PositionElem = TiePointElem->FirstChild("Position")->ToElement();
        TiXmlElement* XYZ_Element = PositionElem->FirstChild("x")->ToElement();
        std::cout << " X: " << XYZ_Element->GetText() << std::endl;
        ss.clear();
        ss.str(XYZ_Element->GetText());
        ss >> xyz;
        tmpPoint.coord.x = xyz;
        XYZ_Element = PositionElem->FirstChild("y")->ToElement();
        std::cout << " Y: " << XYZ_Element->GetText() << std::endl;
        ss.clear();
        ss.str(XYZ_Element->GetText());
        ss >> xyz;
        tmpPoint.coord.y = xyz;
        XYZ_Element = PositionElem->FirstChild("z")->ToElement();
        std::cout << " Z: " << XYZ_Element->GetText() << std::endl;
        ss.clear();
        ss.str(XYZ_Element->GetText());
        ss >> xyz;
        tmpPoint.coord.z = xyz;
        //读取连接点的颜色 RGB
        TiXmlElement* ColorElement = TiePointElem->FirstChild("Color")->ToElement();
        TiXmlElement* RGB_Element = ColorElement->FirstChild("Red")->ToElement();
        std::cout << " R: " << RGB_Element->GetText() << std::endl;
        ss.clear();
        ss.str(RGB_Element->GetText());
        ss >> rgb;
        tmpPoint.color.x = 255 * rgb;
        RGB_Element = ColorElement->FirstChild("Green")->ToElement();
        std::cout << " G: " << RGB_Element->GetText() << std::endl;
        ss.clear();
        ss.str(RGB_Element->GetText());
        ss >> rgb;
        tmpPoint.color.y = 255 * rgb;
        RGB_Element = ColorElement->FirstChild("Blue")->ToElement();
        std::cout << " B: " << RGB_Element->GetText() << std::endl;
        ss.clear();
        ss.str(RGB_Element->GetText());
        ss >> rgb;
        tmpPoint.color.z = 255 * rgb;
        PointCloud.emplace_back(tmpPoint);

        // 读取连接点的track
        /*TiXmlElement* MeasurementElem = TiePointElem->FirstChild("Measurement")->ToElement();
        while (MeasurementElem) {
            TiXmlElement* PhotoIdElement = MeasurementElem->FirstChild("PhotoId")->ToElement();
            std::cout << " PhotoId: " << PhotoIdElement->GetText() << std::endl;
            TiXmlElement* xy_Element = MeasurementElem->FirstChild("x")->ToElement();
            std::cout << " x: " << xy_Element->GetText() << std::endl;
            xy_Element = MeasurementElem->FirstChild("y")->ToElement();
            std::cout << " y: " << xy_Element->GetText() << std::endl;
            MeasurementElem = MeasurementElem->NextSiblingElement();
        }*/
        TiePointElem = TiePointElem->NextSiblingElement();
    }
    StoreColorPlyFileBinaryPointCloud(ply_path, PointCloud);

}
int main(int argc, char* argv[])
{

    //std::string dense_folder = argv[1];

    TiXmlDocument* myDocument = new TiXmlDocument();
    myDocument->LoadFile("IceBearTest - AT - export.xml");

    //TiXmlElement* node = myDocument->FirstChildElement();//获取第一个element节点 BlocksExchange
    //cout << node->Value() << endl;  
    TiXmlElement* rootElement = myDocument->RootElement();  //获取根节点  BlocksExchange
    cout << rootElement->Value() << endl;

    // 读取Block  推荐方法
    TiXmlHandle hRoot(rootElement);      // hRoot是根节点
    TiXmlElement* nodeElem = hRoot.FirstChild("Block").Element(); 
    cout << nodeElem->Value() << endl;  // Block

    TiXmlElement* PhotogroupElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").Element();
    cout << PhotogroupElem->Value() << endl;  // Photogroup

    TiXmlElement* ImageDimensionsElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("ImageDimensions").Element();
    cout << ImageDimensionsElem->Value() << endl;  // ImageDimensions
    TiXmlElement* WidthElem = ImageDimensionsElem->FirstChild("Width")->ToElement();
    cout << WidthElem->Value() << ": " << WidthElem->GetText() << std::endl;
    TiXmlElement* HeightElem = ImageDimensionsElem->FirstChild("Height")->ToElement();
    cout << HeightElem->Value() << ": " << HeightElem->GetText() << std::endl;
    TiXmlElement* FocalLengthElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("FocalLength").Element();
    cout << FocalLengthElem->Value() << ": " << FocalLengthElem->GetText() << std::endl;
    TiXmlElement* SensorSizeElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("SensorSize").Element();
    cout << SensorSizeElem->Value() << ": " << SensorSizeElem->GetText() << std::endl;

    TiXmlElement* PhotoElem = hRoot.FirstChild("Block").FirstChild("Photogroups").FirstChild("Photogroup").FirstChild("Photo").Element();
    cout << PhotoElem->Value() << endl;  // Photo

    string lines;
    double value;
    vector<double> K, R, t;

    int tmp1;
    while (PhotoElem) {
        TiXmlElement* IdElement = PhotoElem->FirstChild("Id")->ToElement();
        std::cout << "Image_Id" << " : " << IdElement->GetText() << std::endl;
        //IdElement->QueryIntAttribute("Id", &tmp1);  //读的是属性,不是元素
        TiXmlElement* ImagePathElement = PhotoElem->FirstChild("ImagePath")->ToElement();
        std::cout << "ImagePath" << " : " << U2G(ImagePathElement->GetText()) << std::endl;
        string colmap_id = U2G(ImagePathElement->GetText());
        colmap_id = colmap_id.substr(colmap_id.find_last_of('\\') + 1);
        cout << colmap_id << endl;  //  IMG_2868.jpg
        // element.getTextNormalize():会自动将前面的空格去掉,官网显示的是规范化输出
        TiXmlElement* RotationElement = PhotoElem->FirstChild("Pose")->FirstChild("Rotation")->ToElement();
        TiXmlElement* CenterElement = PhotoElem->FirstChild("Pose")->FirstChild("Center")->ToElement();
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                string M_ = "M_" + std::to_string(i) + std::to_string(j);
                TiXmlElement* M_Element = RotationElement->FirstChild(M_.data())->ToElement();
                std::cout << M_ << ": " << M_Element->GetText() << std::endl;
                lines = M_Element->GetText();
                cout << lines << endl;
                stringstream ss(lines);  // include<sstream>
                ss >> value;
                R.emplace_back(value);
            }
        }
        TiXmlElement* C_Element = CenterElement->FirstChild("x")->ToElement();
        std::cout << " x : " << C_Element->GetText() << std::endl;
        C_Element = CenterElement->FirstChild("y")->ToElement();
        std::cout << " y : " << C_Element->GetText() << std::endl;
        C_Element = CenterElement->FirstChild("z")->ToElement();
        std::cout << " z : " << C_Element->GetText() << std::endl;
        TiXmlElement* NearDepthElement = PhotoElem->FirstChild("NearDepth")->ToElement();
        std::cout << " NearDepth: " << NearDepthElement->GetText() << std::endl;
        TiXmlElement* FarDepthElement = PhotoElem->FirstChild("FarDepth")->ToElement();
        std::cout << " FarDepth: " << FarDepthElement->GetText() << std::endl;
        std::cout << std::endl;
        PhotoElem = PhotoElem->NextSiblingElement();  // Photo紧挨着Photo
    }

    TiXmlElement* TiePointElem = hRoot.FirstChild("Block").FirstChild("TiePoints").FirstChild("TiePoint").Element();
    cout << "开始读取" << TiePointElem->Value() << endl;  // TiePoint
    while (TiePointElem) {

        TiXmlElement* PositionElem = TiePointElem->FirstChild("Position")->ToElement();
        TiXmlElement* XYZ_Element = PositionElem->FirstChild("x")->ToElement();
        std::cout << " X: " << XYZ_Element->GetText() << std::endl;
        XYZ_Element = PositionElem->FirstChild("y")->ToElement();
        std::cout << " Y: " << XYZ_Element->GetText() << std::endl;
        XYZ_Element = PositionElem->FirstChild("z")->ToElement();
        std::cout << " Z: " << XYZ_Element->GetText() << std::endl;
        TiXmlElement* ColorElem = TiePointElem->FirstChild("Color")->ToElement();
        TiXmlElement* MeasurementElem = TiePointElem->FirstChild("Measurement")->ToElement();
        while (MeasurementElem) {
            TiXmlElement* PhotoIdElement = MeasurementElem->FirstChild("PhotoId")->ToElement();
            std::cout << " PhotoId: " << PhotoIdElement->GetText() << std::endl;
            TiXmlElement* xy_Element = MeasurementElem->FirstChild("x")->ToElement();
            std::cout << " x: " << xy_Element->GetText() << std::endl;
            xy_Element = MeasurementElem->FirstChild("y")->ToElement();
            std::cout << " y: " << xy_Element->GetText() << std::endl;
            MeasurementElem = MeasurementElem->NextSiblingElement();
        }
        TiePointElem = TiePointElem->NextSiblingElement();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值