主頁 > 移動端開發 > 從區域3D點和全域2D點重新創建全域3D點;解決即插即用

從區域3D點和全域2D點重新創建全域3D點;解決即插即用

2022-03-13 15:14:58 移動端開發

Aloha,我有一個位于全域范圍/幀(影像點)中的 2D 關鍵點串列,以及本地范圍內的相應 3D 關鍵點串列(通常稱為紋理或物件點)。影像點的范圍為 x[0-1920]y[0,1080],物點的范圍為 x[-1,1]y[-1,1]。我已經按照本文第 6 頁中描述的方法以及此處的教程進行操作,但是我的 3D 點的輸出根本不正確,點的移動到處都是。下面是我使用 SolvePnP 的方法。我在這里是不是走錯了路,因為 SolvePnP 通常用于檢測相機運動(打開其他建議!)還是我的方法錯誤?

import numpy as np
import cv2
array = np.array # convenience

frame1_2d = \
array([[1033.9708251953125 ,  344.23065185546875],
       [1077.796630859375  ,  617.1146240234375 ],
       [ 958.2716674804688 ,  609.1179809570312 ],
       [1074.8084716796875 ,  782.0444946289062 ],
       [ 975.2044067382812 ,  418.1991882324219 ],
       [1024.0103759765625 ,  931.980712890625  ],
       [1122.6185302734375 ,  605.1196899414062 ],
       [1096.721435546875  ,  418.1991882324219 ],
       [ 999.109375        ,  617.1146240234375 ],
       [ 962.255859375     ,  518.1566772460938 ],
       [1111.662109375     ,  517.1571044921875 ],
       [1014.0499877929688 ,  782.0444946289062 ],
       [1061.8599853515625 ,  930.9811401367188 ]])
frame1_3d = \
array([[-0.01265097688883543   , -0.4992150068283081    , -0.11455678939819336   ],
       [ 0.10584918409585953   , -0.0018199272453784943 ,  0.0023642126470804214 ],
       [-0.14271944761276245   ,  0.06332945823669434   ,  0.1438678503036499    ],
       [ 0.09254898130893707   ,  0.3176574409008026    , -0.17930322885513306   ],
       [-0.1155640035867691    , -0.4058316648006439    ,  0.00021289288997650146],
       [-0.03301446512341499   ,  0.6519031524658203    , -0.3515356183052063    ],
       [ 0.14540529251098633   ,  0.05645819008350372   ,  0.10776595026254654   ],
       [ 0.10836226493120193   , -0.4078497290611267    ,  0.000870194286108017  ],
       [-0.10584865510463715   ,  0.001818838994950056  , -0.0023612845689058304 ],
       [-0.1546039581298828    , -0.17418316006660461   ,  0.10266228020191193   ],
       [ 0.1590884029865265    , -0.17913128435611725   ,  0.09423552453517914   ],
       [-0.0736076831817627    ,  0.3179360628128052    , -0.17892584204673767   ],
       [ 0.05236409604549408   ,  0.6490492820739746    , -0.33908188343048096   ]])

frame2_2d = \
array([[1028.110107421875  ,  327.7352600097656 ],
       [1068.0904541015625 ,  606.7128295898438 ],
       [ 982.1328125       ,  229.74314880371094],
       [1071.0889892578125 ,  778.698974609375  ],
       [ 979.13427734375   ,  403.7291564941406 ],
       [1013.1174926757812 ,  933.6865234375    ],
       [1069.0899658203125 ,  243.7420196533203 ],
       [1080.08447265625   ,  403.7291564941406 ],
       [ 997.1254272460938 ,  616.7119750976562 ],
       [ 983.13232421875   ,  312.7364501953125 ],
       [1071.0889892578125 ,  317.7360534667969 ],
       [1005.1214599609375 ,  778.698974609375  ],
       [1061.0938720703125 ,  936.686279296875  ]])

frame2_3d = \
array([[-0.0004756036214530468, -0.5245562791824341   , -0.010652128607034683 ],
       [ 0.10553547739982605  , -0.00272204983048141  ,  0.0024587283842265606],
       [-0.1196068525314331   , -0.6828885078430176   , -0.14210689067840576  ],
       [ 0.0845363438129425   ,  0.38039350509643555  , -0.028144780546426773 ],
       [-0.11286421865224838  , -0.4302292466163635   ,  0.06919233500957489  ],
       [-0.030065223574638367 ,  0.754790186882019    ,  0.012936152517795563 ],
       [ 0.1010960042476654   , -0.6289429664611816   , -0.11814753711223602  ],
       [ 0.1058841198682785   , -0.4253752827644348   ,  0.08086629956960678  ],
       [-0.10553570091724396  ,  0.002716599963605404 , -0.0024500866420567036],
       [-0.127223938703537    , -0.5319695472717285   , -0.09722068160772324  ],
       [ 0.11508879065513611  , -0.49151480197906494  , -0.07002018392086029  ],
       [-0.06679684668779373  ,  0.38714516162872314  , -0.023669833317399025 ],
       [ 0.05081187188625336  ,  0.7544023990631104   , -0.011078894138336182 ]])

frame3_2d = \
array([[1027.91845703125   ,  338.2441711425781 ],
       [1067.8787841796875 ,  612.0115356445312 ],
       [ 803.141357421875  ,  500.10662841796875],
       [1070.8758544921875 ,  776.8713989257812 ],
       [ 968.9768676757812 ,  413.18048095703125],
       [1012.9332885742188 ,  925.7449340820312 ],
       [1248.699462890625  ,  491.1142578125    ],
       [1089.8570556640625 ,  412.18133544921875],
       [ 995.9501342773438 ,  611.0123901367188 ],
       [ 871.073974609375  ,  461.1397399902344 ],
       [1181.765869140625  ,  454.14569091796875],
       [1003.9421997070312 ,  775.8722534179688 ],
       [1061.884765625     ,  933.7380981445312 ]])

frame3_3d = \
array([[-0.003511453978717327  , -0.5015891194343567    , -0.10520103573799133   ],
       [ 0.10480749607086182   , -0.00019206921570003033, -0.0004397481679916382 ],
       [-0.47764456272125244   , -0.1816674768924713    ,  0.04093759506940842   ],
       [ 0.0936243087053299    ,  0.3628539443016052    , -0.09391097724437714   ],
       [-0.11445926129817963   , -0.41107428073883057   ,  0.01644478738307953   ],
       [-0.03567686676979065   ,  0.720417320728302     , -0.10493464022874832   ],
       [ 0.4529808759689331    , -0.18383921682834625   , -0.02210136130452156   ],
       [ 0.1092790886759758    , -0.41095152497291565   ,  0.011709243059158325  ],
       [-0.10480757057666779   ,  0.00018716813065111637,  0.0004445519298315048 ],
       [-0.3031604290008545    , -0.2810187041759491    ,  0.07747684419155121   ],
       [ 0.3006024956703186    , -0.28319910168647766   ,  0.043038371950387955  ],
       [-0.07087739557027817   ,  0.35837966203689575   , -0.08430898934602737   ],
       [ 0.062416717410087585  ,  0.7248380780220032    , -0.13536334037780762   ]])

#frame1_2d = np.asarray(frame1_2d, dtype=float)
#frame1_3d = np.asarray(frame1_3d, dtype=float)
#frame2_2d = np.asarray(frame2_2d, dtype=float)
#frame2_3d = np.asarray(frame2_3d, dtype=float)
#frame3_2d = np.asarray(frame3_2d, dtype=float)
#frame3_3d = np.asarray(frame3_3d, dtype=float)

# Globalize 3D Points
dist_coeffs = (0.11480806073904032, -0.21946985653851792, 0.0012002116999769957, 0.008564577708855225, 0.11274677130853494)
camera_matrix = np.asarray([
    [1394.6027293299926, 0.0, 995.588675691456],
    [0.0, 1394.6027293299926, 599.3212928484164],
    [0.0, 0.0, 1]
])


# create rotation matrix of points
(success, rotation_vector, translation_vector) = cv2.solvePnP(frame3_3d, frame3_2d, camera_matrix, dist_coeffs, flags=0)
r_matrix = cv2.Rodrigues(rotation_vector)
rotation_matrix = np.zeros((4, 4))
rotation_matrix[:3, :3], _ = cv2.Rodrigues(rotation_vector)
rotation_matrix[:3, 3] = np.transpose(translation_vector)
rotation_matrix[3, 3] = 1

# apply rotation matrix to points
globalized_3d = np.c_[frame1_3d, np.ones((13, 1))]
for j in range(13):
    globalized_3d[j, :] = np.dot(rotation_matrix, globalized_3d[j, :])
print(globalized_3d)

在此先感謝,感謝任何幫助!

Edit: Included some examples in my code, after improving the things suggested by top answer

Edit2: Using flag=1 significantly improved the performance/ reduced a lot of the jitter!

uj5u.com熱心網友回復:

  1. 是的,solvePnP可以使用
  2. 是的,你的數學是錯誤的

我假設你從面部標志檢測器中獲得你的分數,所以它們有一個固定的順序。我還將假設您的 3D 模型點以相同的順序給出,并且它們的值是一致的,并且與您所看到的臉有些相似。您應該排除表示肉和下頜骨(而不是顱骨)的點。您實際上想要跟蹤頭骨,而不是到處移動的嘴唇和下巴的位置。

rvec軸角編碼它的長度是旋轉量(預期在 0 和 3.14=pi 之間),它的方向是旋轉軸。

用于cv.Rodriguesrvec轉換為 3x3 旋轉矩陣。

實際上,只需為自己構建一些函式,它們采用 rvec 和 tvec 并構建一個 4x4 矩陣。將所有點擴展為 (x,y,z,1) 很麻煩,但只有一次。

確保@用于矩陣乘法(或np.dot, np.matmul, ...),因為*它是逐元素乘法。

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442193.html

標籤:python opencv graphics 3d

上一篇:在js中使用彩色影像中的直方圖均衡

下一篇:cv2動作捕捉,.avi檔案被拉伸-Python

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more