当前位置: 首页 > article >正文

首发VM手眼标定xml文件点位取出以及转其他格式

首先放出xml文件:"h15.8r1.xml"

<?xml version="1.0" encoding="UTF-8"?>
<CalibInfo>
    <CalibInputParam>
        <CalibParam ParamName="CreateCalibTime" DataType="string">
            <ParamValue>2024-04-23 19:17:09</ParamValue>
        </CalibParam>
        <CalibParam ParamName="CalibType" DataType="string">
            <ParamValue>NPointCalib</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransNum" DataType="int">
            <ParamValue>9</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotNum" DataType="int">
            <ParamValue>3</ParamValue>
        </CalibParam>
        <CalibParam ParamName="CalibErrStatus" DataType="int">
            <ParamValue>269496395</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransError" DataType="float">
            <ParamValue>1.863625</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotError" DataType="float">
            <ParamValue>0.99647576</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransWorldError" DataType="float">
            <ParamValue>0.24252573</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotWorldError" DataType="float">
            <ParamValue>0.12967792</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecisionX" DataType="float">
            <ParamValue>0.12997331</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecisionY" DataType="float">
            <ParamValue>0.13029985</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecision" DataType="float">
            <ParamValue>0.13013655</ParamValue>
        </CalibParam>
        <CalibPointFListParam ParamName="ImagePointLst" DataType="CalibPointList">
            <PointF>
                <X>1216.51</X>
                <Y>779.13611</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>2908.1958</X>
                <Y>787.07654</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>4600.999</X>
                <Y>784.99518</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>4599.3091</X>
                <Y>1714.9545</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>2903.8613</X>
                <Y>1714.681</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1209.8541</X>
                <Y>1706.0481</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1203.0206</X>
                <Y>2635.2905</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>2898.4265</X>
                <Y>2643.5801</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>4596.5581</X>
                <Y>2643.3296</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>3520.8601</X>
                <Y>1254.7367</Y>
                <R>-60</R>
            </PointF>
            <PointF>
                <X>2903.677</X>
                <Y>1714.9659</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>2992.3616</X>
                <Y>2481.5713</Y>
                <R>60</R>
            </PointF>
        </CalibPointFListParam>
        <CalibPointFListParam ParamName="WorldPointLst" DataType="CalibPointList">
            <PointF>
                <X>475.71002</X>
                <Y>-122.05</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>475.71002</X>
                <Y>97.949997</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>475.71002</X>
                <Y>317.95001</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>595.71002</X>
                <Y>317.95001</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>595.71002</X>
                <Y>97.949997</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>595.71002</X>
                <Y>-122.05</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>715.71002</X>
                <Y>-122.05</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>715.71002</X>
                <Y>97.949997</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>715.71002</X>
                <Y>317.95001</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>595.71002</X>
                <Y>97.949997</Y>
                <R>-60</R>
            </PointF>
            <PointF>
                <X>595.71002</X>
                <Y>97.949997</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>595.71002</X>
                <Y>97.949997</Y>
                <R>60</R>
            </PointF>
        </CalibPointFListParam>
    </CalibInputParam>
    <CalibOutputParam>
        <CalibParam ParamName="RotDirectionState" DataType="int">
            <ParamValue>-1</ParamValue>
        </CalibParam>
        <CalibParam ParamName="IsRightCoorA" DataType="int">
            <ParamValue>-1</ParamValue>
        </CalibParam>
        <PointF ParamName="RotCenterImagePoint" DataType="CalibPointF">
            <RotCenterImagePointX>3611.1401</RotCenterImagePointX>
            <RotCenterImagePointY>2018.9244</RotCenterImagePointY>
            <RotCenterImageR>-999</RotCenterImageR>
        </PointF>
        <PointF ParamName="RotCenterWorldPoint" DataType="CalibPointF">
            <RotCenterWorldPointX>261.2843</RotCenterWorldPointX>
            <RotCenterWorldPointY>470.94211</RotCenterWorldPointY>
            <RotCenterWorldR>-999</RotCenterWorldR>
        </PointF>
        <CalibFloatListParam ParamName="CalibMatrix" DataType="FloatList">
            <ParamValue>-0.00049192336</ParamValue>
            <ParamValue>0.13029745</ParamValue>
            <ParamValue>-261.2843</ParamValue>
            <ParamValue>0.12997237</ParamValue>
            <ParamValue>0.0007893648</ParamValue>
            <ParamValue>-470.94211</ParamValue>
            <ParamValue>-2.5900243e-007</ParamValue>
            <ParamValue>1.2700635e-006</ParamValue>
            <ParamValue>1</ParamValue>
        </CalibFloatListParam>
    </CalibOutputParam>
</CalibInfo>

思路是转json ;json在python里面简直就是字典一样的存在所以直接当字典操作即可;最后读到的点位转成".tup"文件方便hdev助手以及其他调用hdev的程序读取当然稍加修改就可以存成其他格式;上程序:

#pip install xmltodict

import os,sys,time,json,xmltodict
from datetime import datetime
def cmd(s="pause"):os.system(s)
def xml_to_json(xml_file_path, json_file_path):
    try:
        with open(xml_file_path, 'r') as file:# 从文件中读取XML数据
            xml_data = file.read()
        dict_data = xmltodict.parse(xml_data)# 将XML转换为字典
        json_data = json.dumps(dict_data, indent=4)# 将字典转换为JSON
        #print(f"JSON{json_data}")
        with open(json_file_path, 'w') as json_file:# 将JSON数据写入文件
            json_file.write(json_data)
        print(f"JSON file has been saved to {json_file_path}")
        return json_data
    except Exception as e:
        print(f" error : {e}")

xml_file_path = 'h15.8r1.xml'
json_file_path = 'output.json'
json_data=xml_to_json(xml_file_path, json_file_path)# 调用函数

PX=[];
PY=[];
PR=[];         
QX=[];
QY=[];
QR=[];      

def get_ppp_params(obj):
    if isinstance(obj, dict):
        pic=obj['CalibInfo']['CalibInputParam']['CalibPointFListParam'][0]['PointF']#图像点
        wor=obj['CalibInfo']['CalibInputParam']['CalibPointFListParam'][1]['PointF']#物理点
        print('\n\n\n')
        for item in pic:
            print(f"{item};  {item['X']}  {item['Y']}  {item['R']}")
            PX.append(item['X']);PY.append(item['Y']);PR.append(item['R']);
        print('\n\n\n')
        for item in wor:
            print(f"{item};  {item['X']}  {item['Y']}  {item['R']}")
            QX.append(item['X']);QY.append(item['Y']);QR.append(item['R']);
        
        #with open('ppp.json', 'w') as json_file:
        #    json_file.write(f"{iii}")

data = json.loads(json_data)

get_ppp_params(data)

# 取出来了 显示一下
print(f"""
{PX},

{PY},

{PR}, 
      /  
{QX}, 
    
{QY}, 
    
{QR}  
   
""")
           

print('\n\n\n')


import halcon as ha

ha.write_tuple(PX,'PX.tup')
ha.write_tuple(PY,'PY.tup')
ha.write_tuple(PR,'PR.tup')
ha.write_tuple(QX,'QX.tup')
ha.write_tuple(QY,'QY.tup')
ha.write_tuple(QR,'QR.tup')

cmd(s="pause")

好了 运行起来文件就会保存到程序目录;

其他语言 比如C++

我有一个损招; 不说了看程序:

#include <iostream>
#include<Python.h>
int main()
{
	Py_Initialize();
	//Py_Finalize();
	PyRun_SimpleString("print('C++ call python!')");
	PyRun_SimpleString("import os");
	//PyRun_SimpleString("os.system('pause')");
	PyRun_SimpleString("from tkinter import *");
	PyRun_SimpleString("import tkinter as tk");//
	PyRun_SimpleString("window = Tk()");
	PyRun_SimpleString("def callback() :print('click me!')");//import tkinter as tk
	PyRun_SimpleString("b = tk.Button(window, text='hj', command=callback).pack()");
	PyRun_SimpleString("window.mainloop()");
}

你要非说这还是python不是C++ 我要告诉你 那你自己想办法;

你如果是C# 那么

        public string _CMD(string strInput)
        {
            string strOuput;
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";//设置要启动的应用程序
            p.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
            p.StartInfo.RedirectStandardInput = true;// 接受来自调用程序的输入信息
            p.StartInfo.RedirectStandardOutput = true;//输出信息
            p.StartInfo.RedirectStandardError = true;// 输出错误
            p.StartInfo.CreateNoWindow = true;//不显示程序窗口

            //  p.StartInfo.CreateNoWindow = false; //显示程序窗口

            p.Start();//启动程序
            p.StandardInput.WriteLine(strInput + "&exit");//向cmd窗口发送输入信息
            p.StandardInput.AutoFlush = true;
            strOuput = p.StandardOutput.ReadToEnd(); //获取输出信息
            p.WaitForExit(); //等待程序执行完退出进程
            p.Close();
            return strOuput;
        }

// string str = _CMD(@"python xxx.py");

这样能用; 我更倾向于pythonnet 不过C#里面到处 dynamic 感觉不太好;

当然如果你是JS那么js比python灵活 我就不搞笑了;


http://www.kler.cn/a/416483.html

相关文章:

  • 【Python】深入理解Python的字符串处理与正则表达式:文本处理的核心技能
  • A054-基于Spring Boot的青年公寓服务平台
  • docker从入门到入土
  • 【Linux】常见指令 + 权限概念
  • 计算机网络:TCP/IP 协议职责和常见的三种模型介绍
  • HCIA笔记5--STP协议
  • Django-Vue3-Admin - 现代化的前后端分离权限管理系统
  • 53 基于单片机的8路抢答器加记分
  • MySql(面试题理解B+树原理 实操加大白话)
  • 如何在HarmonyOS NEXT中处理页面间的数据传递?
  • logminer挖掘日志归档查找问题
  • 深入理解Oracle DB的锁和闩
  • elementUI非常规数据格式渲染复杂表格(副表头、合并单元格)
  • LeetCode Hot100 1~10
  • 结构型模式-组合模式
  • RabbitMQ高级特性:TTL、死信队列与延迟队列
  • MySQL5.6升级MySQL5.7
  • v-model在h函数和jsx下应该如何写
  • Linux的web服务器
  • Node.js的url模块与querystring模块