আইওএস রিভার্ট ক্যামেরা প্রজেকশন


87

আমি স্পেসে কোনও QR কোড সম্পর্কিত আমার ডিভাইসের অবস্থান অনুমান করার চেষ্টা করছি। আমি এআরকিট এবং ভিশন ফ্রেমওয়ার্ক ব্যবহার করছি, উভয়ই আইওএস 11-এ প্রবর্তিত, তবে এই প্রশ্নের উত্তর সম্ভবত তাদের উপর নির্ভর করে না।

ভিশন ফ্রেমওয়ার্কের সাহায্যে আমি আয়তক্ষেত্রটি পেতে সক্ষম হয়েছি যা ক্যামেরার ফ্রেমে কোনও কিউআর কোডকে সীমাবদ্ধ করে। আমি একটি আদর্শ অবস্থান থেকে কিউআর কোড রূপান্তর করতে প্রয়োজনীয় ডিভাইস অনুবাদ এবং রোটেশনের সাথে এই আয়তক্ষেত্রটি মিলাতে চাই।

উদাহরণস্বরূপ যদি আমি ফ্রেমটি পর্যবেক্ষণ করি:

*            *

    B
          C
  A
       D


*            *

যখন আমি কিউআর কোড থেকে 1 মি দূরে ছিলাম, কেন্দ্রীভূত ছিলাম এবং ধরে নিয়েছিলাম যে কিউআর কোডটির 10 সিমিটার দিক রয়েছে আমি দেখতে পাচ্ছি:

*            *


    A0  B0

    D0  C0


*            *

এই দুটি ফ্রেমের মধ্যে আমার ডিভাইসটির রূপান্তর কী হয়েছে? আমি বুঝতে পারি যে একটি সঠিক ফলাফল সম্ভবত নাও হতে পারে, কারণ সম্ভবত পর্যবেক্ষণ করা কিউআর কোডটি কিছুটা অ পরিকল্পনাকারী এবং আমরা এমন কোনও কিছুতে অ্যাফাইন ট্রান্সফর্মটি অনুমান করার চেষ্টা করছি যা পুরোপুরি এক নয়।

আমি sceneView.pointOfView?.camera?.projectionTransformআরো সহায়ক চেয়ে sceneView.pointOfView?.camera?.projectionTransform?.camera.projectionMatrixযেহেতু পরে ইতিমধ্যে ARKit যে আমি এই সমস্যার জন্য বা আগ্রহ নেই থেকে অনুমিত রুপান্তর একাউন্টে লাগে।

আমি কিভাবে পূরণ করব

func get transform(
  qrCodeRectangle: VNBarcodeObservation,
  cameraTransform: SCNMatrix4) {
  // qrCodeRectangle.topLeft etc is the position in [0, 1] * [0, 1] of A0

  // expected real world position of the QR code in a referential coordinate system
  let a0 = SCNVector3(x: -0.05, y: 0.05, z: 1)
  let b0 = SCNVector3(x: 0.05, y: 0.05, z: 1)
  let c0 = SCNVector3(x: 0.05, y: -0.05, z: 1)
  let d0 = SCNVector3(x: -0.05, y: -0.05, z: 1)

  let A0, B0, C0, D0 = ?? // CGPoints representing position in
                          // camera frame for camera in 0, 0, 0 facing Z+

  // then get transform from 0, 0, 0 to current position/rotation that sees
  // a0, b0, c0, d0 through the camera as qrCodeRectangle 
}

==== সম্পাদনা করুন ====

অনেকগুলি জিনিস চেষ্টা করার পরে, আমি ওপেনসিভি প্রক্ষেপণ এবং দৃষ্টিকোণ সমাধানকারী ব্যবহার করে ক্যামেরা পোজ অনুমানের জন্য গিয়েছিলাম, solvePnPএটি আমাকে একটি ঘূর্ণন এবং অনুবাদ দেয় যা কিউআর কোড রেফারেন্সিয়ালটিতে ক্যামেরার ভঙ্গিকে উপস্থাপন করে । তবে সেই মানগুলি ব্যবহার করার সময় এবং বিপরীত রূপান্তরের সাথে সম্পর্কিত বস্তু স্থাপনের সময়, যেখানে কিউআর কোডটি ক্যামেরার জায়গার মধ্যে থাকা উচিত, আমি সঠিকভাবে স্থানান্তরিত মান পাই এবং আমি ঘূর্ণনটি কাজ করতে সক্ষম হই না:

// some flavor of pseudo code below
func renderer(_ sender: SCNSceneRenderer, updateAtTime time: TimeInterval) {
  guard let currentFrame = sceneView.session.currentFrame, let pov = sceneView.pointOfView else { return }
  let intrisics = currentFrame.camera.intrinsics
  let QRCornerCoordinatesInQRRef = [(-0.05, -0.05, 0), (0.05, -0.05, 0), (-0.05, 0.05, 0), (0.05, 0.05, 0)]

  // uses VNDetectBarcodesRequest to find a QR code and returns a bounding rectangle
  guard let qr = findQRCode(in: currentFrame) else { return }

  let imageSize = CGSize(
    width: CVPixelBufferGetWidth(currentFrame.capturedImage),
    height: CVPixelBufferGetHeight(currentFrame.capturedImage)
  )

  let observations = [
    qr.bottomLeft,
    qr.bottomRight,
    qr.topLeft,
    qr.topRight,
  ].map({ (imageSize.height * (1 - $0.y), imageSize.width * $0.x) })
  // image and SceneKit coordinated are not the same
  // replacing this by:
  // (imageSize.height * (1.35 - $0.y), imageSize.width * ($0.x - 0.2))
  // weirdly fixes an issue, see below

  let rotation, translation = openCV.solvePnP(QRCornerCoordinatesInQRRef, observations, intrisics)
  // calls openCV solvePnP and get the results

  let positionInCameraRef = -rotation.inverted * translation
  let node = SCNNode(geometry: someGeometry)
  pov.addChildNode(node)
  node.position = translation
  node.orientation = rotation.asQuaternion
}

এখানে ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

যেখানে A, B, C, D হল সেই প্রোগ্রামে যে অর্ডার দেওয়া হয় তাতে কিউআর কোড কর্নার।

ফোনটি ঘোরার সময় পূর্বাভাস উত্পন্ন জায়গায় থাকে তবে এটি যেখানে হওয়া উচিত সেখান থেকে স্থানান্তরিত হয়। আশ্চর্যের বিষয়, আমি যদি পর্যবেক্ষণের মানগুলি স্থানান্তর করি তবে আমি এটি সংশোধন করতে সক্ষম হয়েছি:

  // (imageSize.height * (1 - $0.y), imageSize.width * $0.x)
  // replaced by:
  (imageSize.height * (1.35 - $0.y), imageSize.width * ($0.x - 0.2))

এখানে চিত্র বর্ণনা লিখুন

এবং এখন পূর্বাভাস উত্সটি দৃ rob়ভাবে স্থানে থাকে। তবে শিফট মানগুলি কোথা থেকে এসেছে তা আমি বুঝতে পারি না।

পরিশেষে, আমি কিউআর কোড রেফারেনশিয়ালের সাথে তুলনামূলকভাবে স্থির করার চেষ্টা করেছি:

    var n = SCNNode(geometry: redGeometry)
    node.addChildNode(n)
    n.position = SCNVector3(0.1, 0, 0)
    n = SCNNode(geometry: blueGeometry)
    node.addChildNode(n)
    n.position = SCNVector3(0, 0.1, 0)
    n = SCNNode(geometry: greenGeometry)
    node.addChildNode(n)
    n.position = SCNVector3(0, 0, 0.1)

আমি যখন সরাসরি কিউআর কোডটি দেখি তখন ওরিয়েন্টেশনটি ঠিকঠাক হয় তবে তারপরে এটি এমন কোনও কিছুতে স্থানান্তরিত হয় যা মনে হয় ফোন রোটেশনের সাথে সম্পর্কিত:এখানে চিত্র বর্ণনা লিখুন

আমার কাছে অসামান্য প্রশ্নগুলি হ'ল:

  • আমি ঘূর্ণনটি কীভাবে সমাধান করব?
  • অবস্থান শিফট মানগুলি কোথা থেকে আসে?
  • ঘূর্ণন, অনুবাদ, কিউআরকর্নারকর্ডিনেটসআইএনকিউআরএফ, পর্যবেক্ষণগুলি, আন্তঃবিজ্ঞান যাচাই করে কোন সাধারণ সম্পর্ক? এটি কি ও ~ কে ^ -1 * (R_3x2 | টি) প্রশ্ন? কারণ যদি তা কয়েক মাত্রার ক্রম দ্বারা বন্ধ থাকে।

যদি এটি সহায়ক হয় তবে কয়েকটি সংখ্যার মান এখানে দেওয়া হল:

Intrisics matrix
Mat 3x3
1090.318, 0.000, 618.661
0.000, 1090.318, 359.616
0.000, 0.000, 1.000

imageSize
1280.0, 720.0
screenSize
414.0, 736.0

==== সম্পাদনা ====

আমি লক্ষ্য করেছি যে ফোনটি যখন কিউআর কোডের সাথে অনুভূমিকভাবে সমান্তরাল থাকে তখন ঘূর্ণনটি সূক্ষ্মভাবে কাজ করে (যেমন রোটেশন ম্যাট্রিক্সটি [[a, 0, খ], [0, 1, 0], [সি, 0, ডি]]] ), আসল কিউআর কোড ওরিয়েন্টেশন কী তা বিবেচনাধীন নয়:

এখানে চিত্র বর্ণনা লিখুন

অন্যান্য ঘূর্ণন কাজ করে না।


আরে, আপনি কিউআর কোডের মাধ্যমে ডিভাইসগুলির দূরত্ব পাওয়ার চেষ্টা করছেন? যদি তা হয় তবে নীচে আমার উত্তরটি দেখুন।
এফেলন ড্যান্টজলার

সম্পাদনা করুন: আপনার অসামান্য প্রশ্নগুলির জন্য, ১. মনে হচ্ছে কেবল একটি অপ্রয়োজনীয় মান .োকানো হয়েছে। সম্ভবত বলা ম্যাপিং পদ্ধতিতে, বা চেনাশোনাগুলি drawCircle(... rotation)
আঁকানো

আপনি কিছু কোড ভাগ করতে সক্ষম হবেন?
মিশাল জাবরোভস্কি

উত্তর:


2

সমন্বয় সিস্টেমের চিঠিপত্র

বিবেচনা করুন যে Vision/ CoreMLসমন্বয় সিস্টেম সিস্টেমের সাথে ARKit/ SceneKitস্থানাঙ্কের সাথে সামঞ্জস্য করে না । বিশদ জন্য এই পোস্টে দেখুন

আবর্তনের দিকনির্দেশ

আমি মনে করি সমস্যাটি ম্যাট্রিক্সে নেই। এটি শীর্ষে অবস্থানের মধ্যে রয়েছে। 2 ডি চিত্রগুলি ট্র্যাক করার জন্য আপনাকে এবিসিডি শীর্ষ প্রান্তকে ঘড়ির কাঁটার বিপরীতে স্থাপন করতে হবে (প্রারম্ভিক বিন্দুটি কাল্পনিক উত্সে অবস্থিত একটি শীর্ষবিন্দু x:0, y:0)। আমি মনে করি ভিএনআরেক্টেঙ্গেল অবজারভেশন ক্লাসে অ্যাপল ডকুমেন্টেশন (কোনও চিত্র বিশ্লেষণের অনুরোধের দ্বারা সনাক্ত করা আয়তক্ষেত্রাকার অঞ্চলগুলি সম্পর্কিত তথ্য) অস্পষ্ট। আপনি অফিসিয়াল ডকুমেন্টেশনের মতো আপনার ক্রমগুলি একই ক্রমে রেখেছিলেন:

var bottomLeft: CGPoint
var bottomRight: CGPoint
var topLeft: CGPoint
var topRight: CGPoint

তবে তাদের একই ধরণের Zধীরে ধীরে ঘোরানোর দিকের মতো ( অক্ষ সম্পর্কে ) কার্টেসিয়ান স্থানাঙ্ক ব্যবস্থায় ঘটে যাওয়ার দরকার:

এখানে চিত্র বর্ণনা লিখুন

আরকিট-এ ওয়ার্ল্ড কোঅর্ডিনেট স্পেস (পাশাপাশি সিনকিট এবং ভিশনেও) সর্বদা একটি অনুসরণ করে right-handed convention(ইতিবাচক Yঅক্ষটি পয়েন্ট অবধি উপরে, Zদর্শকের দিকে ধনাত্মক Xঅক্ষ এবং দর্শকের ডান দিকে ধনাত্মক অক্ষগুলি) । ক্যামেরা লোকাল কোর্ডিনেট স্পেসে কাজ করে।

যে কোনও অক্ষ সম্পর্কে আবর্তনের দিকটি ধনাত্মক (কাউন্টার-ক্লকওয়াইজ) এবং নেতিবাচক (ক্লকওয়াইজ)। আরকিট এবং ভিশনে ট্র্যাকিংয়ের জন্য এটি সমালোচনামূলকভাবে গুরুত্বপূর্ণ।

এখানে চিত্র বর্ণনা লিখুন

আবর্তনের ক্রমটিও বোধগম্য হয়। আরকিট, পাশাপাশি সিনকিট উপাদানগুলির বিপরীত ক্রমে নোডের পিভট সম্পত্তির সাথে সম্পর্কিত ঘূর্ণন প্রয়োগ করে: প্রথমে roll( Zঅক্ষ সম্পর্কে ), তারপরে yaw( Yঅক্ষ সম্পর্কে ), তারপরে pitch( Xঅক্ষ সম্পর্কে )। সুতরাং ঘূর্ণন ক্রম হয় ZYX


1

গণিত (ত্রি।):

সমীকরণ

দ্রষ্টব্য: নীচের lঅংশটি (কিউআর কোড দৈর্ঘ্য), বাম কোণ kএবং শীর্ষে কোণটি i(ক্যামেরা)

ছবি


অবশ্যই, তবে আমি কেবল পর্যবেক্ষণকৃত কোণ iএবং মূল দূরত্বটি জানিl
গিগ 18

এটি ঠিক আছে, এর বিপরীতটি খুঁজে পাওয়ার কোনও উপায় আছে iকি? যদি এটির কোনও সঠিক কোণ না হয় তবে এটির জন্য lআরও বেশি গণিত জড়িত রয়েছে kবা theta; i + k + theta = 180
এফেলন ড্যান্টজলার 21

4
ত্রিকোণমিতিটি কাজ করার জন্য আমার দুটি দূরত্ব এবং একটি কোণ, বা দুটি কোণ এবং একটি দূরত্ব প্রয়োজন। কেবল একটি কোণ এবং এক দূরত্বে থেকে সমস্ত কিছু পাওয়ার কোনও উপায় নেই
গিগ

এটি কি QR কোডটি বর্গক্ষেত্রের সাহায্যে সহায়তা করে, যাতে আপনি দুটি উল্লম্ব এবং অনুভূমিক উভয় কোণ পর্যবেক্ষণ করতে পারেন?
বব ওয়েকফিল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.