ZBLOG

// // Created by dell on 2024/4/18. // #ifndef RKNN_YOLOV5_ANDROID_APK_DEMO_SKIPROPE_H #define RKNN_YOLOV5_ANDROID_APK_DEMO_SKIPROPE_H #include #include #include #include "CommonStruct.h" #include "SportCountI...

将 C++ 代码翻译成 Swift 涉及到对类结构、成员函数、数据类型等的转换。下面是你提供的 C++ 代码的大致 Swift 实现:

import Foundation

// 假设这些结构体和协议已经定义好
struct ObsJoint {
    var x: Float
    var y: Float
}

struct ObsBody {
    var joints: [ObsJoint]
}

struct ObsPerson {
    var id: Int
    var failId: Int?
    var interrupt: Int
    var status: Int
    var successCount: Int
    var failCount: Int
}

protocol SportCountInterface {
    func execute(body: ObsBody, person: inout ObsPerson)
}

class SkipRopeCount {
    // 属性模拟 
    var location_: Int = 0
    var localRect_: [ObsJoint] = []
    
    // 初始化方法与配置模拟 
    func initConfig(_ config: SkipRopeConfig) { /*...*/ }
    
    // 方法模拟 
    func jumpCount(neck: ObsJoint, leftHip: ObsJoint, rightHip: ObsJoint,
                   leftAnkle: ObsJoint, rightAnkle: ObsJoint,
                   leftElbow: ObsJoint, rightElbow: ObsJoint,
                   leftShoulder: ObsJoint, rightShoulder: ObsJoint,
                   leftWrist: ObsJoint, rightWrist: ObsJoint,
                   rect _: CGRect, location _: Int) { /*...*/ }
    
    // 其他属性或方法省略...
}

// 假设这是之前定义的配置结构体 
struct SkipRopeConfig {
   var minDistanceTimes: Float = 0.0
   var low0Low1Times: Float = 0.0
   var fps : Float = 0.0
   var maxFpsTimes : Float = 0.0
   var preMinDistanceTimes : Float = 0.0
   var differMinDistanceTimes : Float = 0.0
}

class SkipRope : SportCountInterface {

    private let skipRopeConfig_: SkipRopeConfig!
    private var skipRopeCountMap_: [Int : SkipRopeCount] = [:]

    
    init(configPath:String , width:Int , height:Int) {
        self.skipRopeConfig_ = LoadConfig(fromPath=configPath)

        let skipRopeCount = SkipRopeCount()
        skipRopeCount.location_ = 1
        
        skipRopeCount.localRect_.append(ObsJoint(x: Float(width)/3, y: Float(height)/2))
        skipRopeCount.localRect_.append(ObsJoint(x: Float(width)/3, y: Float(height)))
        skipRopeCount.localRect_.append(ObsJoint(x: (Float(width)*2)/3, y: Float(height)))
        skipRopeCount.localRect_.append(ObsJoint(x:(Float(width)*2)/3 ,y:(Float(height)/2)))

        skipRopeCount.initConfig(skipRopeConfig_)
        
        self.skipRopeCountMap_[1] = skipRopeCount

        
       
      
     
       
        

        
   
   

        
  
        
      
      
       
         
    

    
        
        
   
 

    
   
        

           
       

    
  
     

     
  
    

     
    

   
     
    
    


    
          
      

    

  


   
    
  

}


    
    
   

    
    
  
    
    

 
    
   

    




    
    
    
    



     
  
    
  




  
  
 

  
  

    

  
  
  

    
    
    
    
    
    
      


func execute(body _: obs_body_t , person :inout obs_person_t ) {

        
      
      for (key,obj) in self.skip_rope_count_map_ {

           person.id=obj.location_
          let exist_person=false
            
         let leftAnkle=body.joints[OBS_JOINT_ANKLE_LEFT]
         let rightAnkle=body.joints[OBS_JOINT_ANKLE_RIGHT]
         
         if Flags.isPointInPolygon(obj.localRect_, point:leftAnkle) || Flags.isPointInPolygon(obj.localRect_,point:rightAnkle) {
             let neck= body.joints[OBS_JOINT_NECK]
             let leftHip= body.joints[OBS_JOINT_HIP_LEFT]
             let rightHip= body.joints[OBS_JOINT_HIP_RIGHT]
             
             obj.jump_count(neck:leftankle,lefthip:leftHip,rightHip:rightHip,leftAnkle:leftankle,rightankle:rightankle,leftElbow:leftelbow,right_elbow:right_elbow,left_shoulder:left_shoulder,right_shoulder:right_shoulder,left_wrist:left_wrist,right_wrist:right_wrist,)
             
              if obj.fail_id != nil{
                  person.fail_id=obj.fail_id!
              }
              
              obj.interrupt_count_number=obj.interrupt_status_

              person.interrupt=obj.interrupt_status_
              person.status=0
                
                
          }else{
              
          }
          
           // out of range 
            if !exist_person{
                if obj.out_range_count>OUT_RANGE_COUNT{
                    person.status=1 
                }
            }

           person.fail_count=obj.fail_count_
           person.success_count=obj.count_number
        
      print("success count:\(person.success_count)")
      }

}
}

注意事项:

  • Swift 和 C++ 的语法差异:Swift 使用的是更现代化的语法,并且在内存管理上使用 ARC(自动引用计数),而不是手动管理。
  • 类型安全:Swift 对类型安全有更严格的要求,因此需要确保所有变量和函数都声明了正确的类型。
  • JSON解析:C++中使用的是Json::Reader,而在Swift中通常会用JSONSerialization或更现代化的方法,如 Codable

以上示例并不是一个完全可编译的代码,而是一个简化后的版本,旨在帮助你理解如何将类和方法从 C++ 转换为 Swift。在真实应用中,你可能还需要添加额外的功能、错误处理以及根据项目需求进行调整。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21923

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?