Как из фотографии получить 3D?

в 17:21, , рубрики: визуализация, обработка изображений

Как из фотографии получить 3D? - 1
Хотелось получать изображение в очки виртуальной реальности из одной камеры(ведь они делались под смартфон или планшет), чтобы дописать в него дополненную реальность.

Все действо изначально происходит в трехмерном пространстве, то есть плоскость изображения можно вращать в любую сторону, у каждого приходящего пикселя  берется освещенность одного из цветов или их совокупности и этот пиксель перпендикулярно выносится из плоскости изображения на число освещенности.

Как из фотографии получить 3D? - 2

Как из фотографии получить 3D? - 3

Как вы видите получается относительно сносное 3D, годное для получения стереоизображения.

Но это картинка с выборкой по диапазону освещенности, вот что выйдет если фильтр снять.

Как из фотографии получить 3D? - 4

Исходный код довольно прост.

Используется язык Processing

Сдвиг выборки управляется sw (включите английскую раскладку).

Код

int colfilter=25;  // диапазон фильтра+-

import processing.video.*;
float rotx = 0;//переменные поворота
float roty = 0;

int countcol=1;//счетчик

float pixelBrightness=0; //освещенность пикселя
float Brightness=0;///освещеность
Capture cam;
int numPixels;//переменная количества пикселей
void setup() {
size(900,700, P3D);

cam = new Capture(this, 320,240);///запускаем камеру
cam.start();
numPixels = cam.width * cam.height;
frameRate(30);//кадры в секунду

}

void draw()
{

background(255);
translate(width/2.0, height/2.0-250, +200);//переместимся на середину
rotateY(roty);//поворот изображения
// rotateX(rotx);

if (cam.available() == true)
{
cam.read();//читаем камеру

cam.loadPixels();//загружаем пиксели

float col[]=new float[numPixels]; //создаем массив под хранение освещенности

loadPixels();

for (int i = 0; i < numPixels; i++) {

pixelBrightness =red(cam.pixels[i]);   ///берем освещенность  по красному цвету каждого пикселя
// pixelBrightness =brightness(cam.pixels[i]);//можете использовать любую освещенность
col[i]=pixelBrightness;//записываем освещенность в массив
// Brightness = red(cam.pixels[i]);
// float Brightness2 = blue(cam.pixels[i]);
// float Brightness3 = green(cam.pixels[i]);

updatePixels();//обновляем пиксели

}

translate(-160,120,0);//по очереди перебираем пиксели и отрисовываем их
for(int i=0;i<240;i++)
{
for(int j=0;j<320;j++)
{

if(countcol<numPixels)
{
if(col[countcol]<colfilter+50&&col[countcol]>colfilter-50)

{
fill(col[countcol]);
point(j*1.3,i*1.3,col[countcol]/2);
}

countcol++;

}}}

countcol=0;
}}
void mouseDragged() {
float rate = 0.01;
rotx += (pmouseY-mouseY) * rate;
roty += (mouseX-pmouseX) * rate;
}

void keyPressed()   /////Управление положение выборки освещенности
{
if(key=='w')
{
colfilter++;
}

if(key=='s')
{
colfilter--;
}
}

 

Автор: Dorrin

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js