二維影象的三維旋轉
1 #include <iostream> 2 #include <opencv.hpp> 3 #include <string> 4 #include <fstream> 5 6 using namespace std; 7 using namespace cv; 8 9 const float PI=3.1415926; 10 11 void main() 12 { 13 string imgPath="data/source_images/"; 14 Mat srcImg=imread(imgPath+"moon.jpg"); 15 pyrDown(srcImg, srcImg); 16 pyrDown(srcImg, srcImg); 17 18 namedWindow("show",0); 19 imshow("show", srcImg); 20 waitKey(0); 21 22 int imgHeight=srcImg.rows; 23 int imgWidth=srcImg.cols; 24 25 float alpha, beta, gamma; 26 alpha=0; 27 beta=0; 28 gamma=30*PI/180; 29 Mat Rot=Mat::eye(3,3,CV_32FC1); 30 31 Rot.at<float>(0, 0) = cos(beta) * cos(gamma); 32 Rot.at<float>(0, 1) = cos(beta) * sin(gamma); 33 Rot.at<float>(0, 2) = -sin(beta); 34 Rot.at<float>(1, 0) = sin(alpha) * sin(beta) * cos(gamma) - cos(alpha) * sin(gamma);35 Rot.at<float>(1, 1) = sin(alpha) * sin(beta) * sin(gamma) + cos(alpha) * cos(gamma); 36 Rot.at<float>(1, 2) = sin(alpha) * cos(beta); 37 Rot.at<float>(2, 0) = cos(alpha) * sin(beta) * cos(gamma) + sin(alpha) * sin(gamma); 38 Rot.at<float>(2, 1) = cos(alpha) * sin(beta) * sin(gamma) - sin(alpha) * cos(gamma); 39 Rot.at<float>(2, 2) = cos(alpha) * cos(beta); 40 41 Mat invRot; 42 invert(Rot, invRot, DECOMP_SVD); 43 44 float fx=930.965; 45 float fy=930.884; 46 float cx=513.823; 47 float cy=385.656; 48 49 Mat point3D=Mat::zeros(3, 1, CV_32FC1); 50 Mat oldPoint3D=Mat::zeros(3, 1, CV_32FC1); 51 52 Mat dstImg=srcImg.clone(); 53 dstImg.setTo(0); 54 55 uchar* pImgData=(uchar*)srcImg.data; 56 uchar* pDstData=(uchar*)dstImg.data; 57 for (int j=0; j<imgHeight; j++) 58 { 59 for (int i=0; i<imgWidth; i++) 60 { 61 float X=(i-cx)/fx; 62 float Y=(j-cy)/fy; 63 float Z=1; 64 65 point3D.at<float>(0,0)=X; 66 point3D.at<float>(1,0)=Y; 67 point3D.at<float>(2,0)=Z; 68 //求旋轉前座標點 69 oldPoint3D=invRot*point3D; 70 float oldX=oldPoint3D.at<float>(0,0); 71 float oldY=oldPoint3D.at<float>(1,0); 72 float oldZ=oldPoint3D.at<float>(2,0); 73 //重投影到二維平面 74 if (oldZ>1e-3) 75 { 76 float u= ((fx*oldX+cx*oldZ)/oldZ); 77 float v= ((fy*oldY+cy*oldZ)/oldZ); 78 79 int u0=floor(u); 80 int v0=floor(v); 81 int u1=u0+1; 82 int v1=v0+1; 83 84 if (u0>=0 && v0>=0 && u1<imgWidth && v1<imgHeight) 85 { 86 float dx=u-u0; 87 float dy=v-v0; 88 float weight1=(1-dx)*(1-dy); 89 float weight2=dx*(1-dy); 90 float weight3=(1-dx)*dy; 91 float weight4=dx*dy; 92 93 pDstData[j*imgWidth*3+i*3+0]=weight1*pImgData[v0*imgWidth*3+u0*3+0]+ 94 weight2*pImgData[v0*imgWidth*3+u1*3+0]+ 95 weight3*pImgData[v1*imgWidth*3+u0*3+0]+ 96 weight4*pImgData[v1*imgWidth*3+u1*3+0]; 97 98 pDstData[j*imgWidth*3+i*3+1]=weight1*pImgData[v0*imgWidth*3+u0*3+1]+ 99 weight2*pImgData[v0*imgWidth*3+u1*3+1]+ 100 weight3*pImgData[v1*imgWidth*3+u0*3+1]+ 101 weight4*pImgData[v1*imgWidth*3+u1*3+1]; 102 103 pDstData[j*imgWidth*3+i*3+2]=weight1*pImgData[v0*imgWidth*3+u0*3+2]+ 104 weight2*pImgData[v0*imgWidth*3+u1*3+2]+ 105 weight3*pImgData[v1*imgWidth*3+u0*3+2]+ 106 weight4*pImgData[v1*imgWidth*3+u1*3+2]; 107 } 108 109 } 110 111 } 112 } 113 114 imshow("show", dstImg); 115 waitKey(0); 116 }
相關推薦
二維影象三維化
今天看了一篇大神的關於在2D影象中插入物體構建動畫的文章,覺得很有意思,現在簡要copy一下分享給大家 1: 物體表達的必要性和重要性 機器人能像人一樣識別物體,是機器人視覺(robot vision)專家的夢想和追求。要想識別物體,不論是人還是機器人,僅僅看到是不夠
【matplotlib】繪製簡單二維、三維影象
學習,matplotlib模組的繪圖功能。 具體模組匯入在最後第7部分彙總程式碼中給出。 1、繪製基本影象 def initial_image(): # define x\y x = np.arange(0.0, 2.0,
如何在二維或三維地圖中疊加一個視訊(以mapboxgl為例)
手上有一個交通分析結果視訊,正射視角,來自遙感衛星視訊,通過加工形成交通流量視訊分析成果,現在需要把分析結果放在地圖中進行視覺化展示 mapboxgl的地圖如下 map = new mapboxgl.Map({ contai
2.遺傳演算法matlab實現(2):再加例項兩個(一元二元完整作圖,二維圖形,三維圖形以及進化過程圖)
(1)直接在命令視窗輸入以下程式碼: figure(1); hold on; lb=1;ub=2; %函式自變數範圍[1,2] ezplot('sin(10*pi*X)/X',[lb,ub]);
C語言基礎-----二維陣列,三維陣列
一 二維陣列 1.二維陣列的定義: 資料型別 陣列名[行][列] ={ 數值1,數值2......}; 2.二維陣列有幾行,就代表有幾個一維陣列. int a[2][3] = {1,2,3,4,5,
陣列(一維、二維、三維)的動態申請及用vector的表示方法
轉載 :點選開啟連結 變長一維陣列 這裡說的變長陣列是指在編譯時不能確定陣列長度,程式在執行時需要動態分配記憶體空間的陣列。實現變長陣列最簡單的是變長一維陣列,你可以這樣做: #include<iostream> using namespace std;
C++陣列(一維、二維、三維)的動態分配new、初始化memset和釋放delete
【原文】http://blog.csdn.net/shanzhizi/article/details/7835752 陣列的動態分配、初始化和釋放經常用到,這裡總結一下,尤其是二維陣列 一維陣列 一維陣列的動態分配,初始化和撤銷都好說,幾乎每一本C++教材都會做出詳細的說明
如何拿vector生成二維陣列三維陣列
#include<vector> using namespace std; /* #define HEIGHT 5 #define WIDTH 3 int main() {vector<vector<double>> array2D;//
單影象三維重建、2D到3D風格遷移和3D DeepDream
作者:Longway Date:2020-04-25 來源:單影象三維重建、2D到3D風格遷移和3D DeepDream 專案網址:http://hiroharu-kato.com/projects_en/neural_renderer.html 程式碼網址:https://github.com/h
一維到三維的區間最大和
p1173 最大連續和 題目 描述 Description 給定N個數,求這N(1 <=N <= 100,000) 個數的某個連續子序列的累加和,保證這個連續子序列的累加和最大。 輸入格式 Input Format 第一行:一個整數N。(1 <=N <
二維影象的三維旋轉
1 #include <iostream> 2 #include <opencv.hpp> 3 #include <string> 4 #include <fstream> 5 6 using namespace std; 7 u
迪斯尼新影象演算法,二維照片轉三維模型
【感謝@袁欣_Jason 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試推薦給伯樂線上。】 迪斯尼蘇黎世研究團隊開發出了一種新程式,它可以利用二維(2D)照片做三維(3D)建模。使用數百張攝影照片和一種特殊設計的演算法,該程式可以給電影、電視和遊戲做複雜且真
計算機圖形學——二維旋轉與三維旋轉
Steven M. LaValle 的 Virtual Reality 這本書中講了關於幾何模型變換以及顯示的知識,跟網上的資料比這本書裡講的比較簡潔,於是想做一個總結。本部落格參考了《Virtual Reality》的中文譯版,翻譯與校驗人員: 上海交通大學媒體技術實驗室(
淺談二維和三維影象資料
再將其輸出為檔案的程式碼如下,都是比較簡單的讀寫呼叫,由此同時可以看出,無論是2維還是3維影象,使用一維陣列的方式存資料,對於IO來說是十分方便。 void OutPutVolume(const char* fileName,unsigned char* pointer,int width,int
python 二維數組90°旋轉
python 二維數組 90度 旋轉題目:使用python生成一個4×4二維數組並將其順時針旋轉90°源碼如下:import random datarow=[] data=[] for i in range(4): for j in range(4): datarow.append(r
CSS3景深、三維變換屬性及旋轉三維立方體的實現
場景 htc 學歷 ati light range frame 焦距 說道 瀏覽器坐標系 在講正式語法之前,首先需要了解瀏覽器坐標系 這需要我們把瀏覽器界面想象成一個立體的場景 這是網上流傳很廣的瀏覽器坐標系圖片 從左到右的方向是瀏覽器x軸的正方向 從上到下的方向是瀏覽器
HDU 5517 【二維樹狀數組///三維偏序問題】
void blog scan memset 集合 while ++ struct name 題目鏈接:【http://acm.split.hdu.edu.cn/showproblem.php?pid=5517】 題意:定義multi_set A<a , d>,B
ObjectARX中三維多段線轉二維多段線的方法
ext tro errors ont step sed close des on() Acad::ErrorStatus AcDb3dPolylineToAcDb2dPolyline(AcDbObjectId objId, int flag /* =0 */) {
QGIS 二三維效果
QGIS 三維 提示:所有環境環境所使用的QGIS SDK ,包括:QGIS FOR ANDRIOD、androidQGIS FOR LINUX、androidQGIS FOR LINUX、QGISSERVER、QGIS與OSGEARTH集成的二三維開發環境等QGIS二次開發擴展環境為同一套QGIS底層開發環
CG-二維三維圖形變換-學習筆記
結果 設備 right 可行性 spl http 情況下 width 範圍 一、計算機圖形學中坐標系分類 世界坐標系、建模坐標系、觀察坐標系、設備坐標系、規範化坐標系 其中:規範化坐標系是一個中間坐標系,坐標值取值範圍0-1; 二、二維圖形變換 1. 變換種類:比例、旋轉、