1. 程式人生 > >二維影象的三維旋轉

二維影象的三維旋轉

  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. 變換種類:比例、旋轉、