Перейти к содержимому
Compvision.ru
Tlya

написать 360 Player

Recommended Posts

Доброго времени!)

Есть задача написать плеер для проигрывания видео 360. (В идеале на два глаза, но для начала пойдет и на 1 ^_^ )

Понятное дело, что никто за меня это делать не будет, поэтому прошу сугубо совета. В сторону каких функций в опенсв стоит смотреть, есть ли в ней (библиотеке) подходящие инструменты для данной задачи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А если быть точнее, как натягивать видео на сферу? (это если уж совсем просто выражаясь :rolleyes: )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю тут больше OpenGL подходит, там вообще с текстурами проблем не будет, да и всякие cubemap-ы есть со sky box-ами, ну и аппаратное ускорение тоже штука не лишняя.

 

Еще тут посмотрите: http://proj4.org/projections/qsc.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А подскажите тогда, пожалуйста, как в opencv сделать эффект лупы? (выпуклой или "впуклой" :D не важно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да тут то все просто.


#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

using namespace cv;

void applyLens(Mat& src,float x,float y, float R, float M, Mat& dst)
{
    Mat tmp=src.clone();
    for(int i=y-R;i<y+R;++i)
    {
        for(int j=x-R;j<x+R;++j)
        {
            float x1=j-x;
            float y1=i-y;
            float r=sqrt(x1*x1+y1*y1);
            if(r<R)
            {
                float F = 1 + (R-r)/R*(M-1);
                // float F = 1 + (R*R-r*r)/(R*R)*(M-1);
                int x_sampl=round(x+x1/F);
                int y_sampl=round(y+y1/F);
                if(x_sampl>=0 && y_sampl>=0 && x_sampl<src.cols && y_sampl<src.rows)
                {
                tmp.at<Vec3b>(i,j)=src.at<Vec3b>(y_sampl,x_sampl);
                }
            }
        }
         
    }
    circle(tmp,Point(x,y),R,Scalar::all(255),1,CV_AA); 
    dst=tmp.clone();
}

int main(int argc, const char *argv[])
{
    Mat img=imread("lena.jpg");
    imshow("src",img);
    Mat dst;
    applyLens(img,256,256, 200, 0.5, dst);
    applyLens(dst,256,256, 150, 3, dst);
    imshow("result",dst);
    waitKey(0);
}

 

 

Screenshot from 2017-09-03 17-55-03.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Большое спасибо!)

Вы тут использовали функцию, можно сказать написанную вручную, а есть ли какая-нибудь опеновская готовая?

И еще, можно ли как-то сблурить образовавшиеся при растяжении квадраты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет, опенсвшной фунуции нет. Интерполяцию можно написать чтобы квадраты сгладить. Можно просто увеличить изображение перед тем как применять эффект линзы и брать пиксели уже с увеличенного изображения, соответственно нужно подправить коэффициенты.

Можно еще remap приспособить, там и интерполяция есть.

что то типа такого:

void applyLens_remap(Mat& src,float x,float y, float R, float M, Mat& dst)
{
    Mat tmp=src.clone();
    Mat mapx=Mat(tmp.size(),CV_32FC1);
    Mat mapy=Mat(tmp.size(),CV_32FC1);
    for(int i=0;i<src.rows;++i)
    {
        for(int j=0;j<src.cols;++j)
        {
        mapx.at<float>(i,j)=j;
        mapy.at<float>(i,j)=i;
        }
    }
    for(int i=y-R;i<y+R;++i)
    {
        for(int j=x-R;j<x+R;++j)
        {
            float x1=j-x;
            float y1=i-y;
            float r=sqrt(x1*x1+y1*y1);
            if(r<R)
            {
                float F = 1 + (R-r)/R*(M-1);
                // float F = 1 + (R*R-r*r)/(R*R)*(M-1);
                int x_sampl=round(x+x1/F);
                int y_sampl=round(y+y1/F);
                
                if(x_sampl>=0 && y_sampl>=0 && x_sampl<src.cols && y_sampl<src.rows)
                {
                    mapx.at<float>(i,j)=x_sampl;
                    mapy.at<float>(i,j)=y_sampl;
                    //tmp.at<Vec3b>(i,j)=src.at<Vec3b>(y_sampl,x_sampl);
                }
            }
        }
         
    }
    remap(src,dst,mapx,mapy,INTER_LINEAR);
    //circle(tmp,Point(x,y),R,Scalar::all(255),1,CV_AA); 
    //dst=tmp.clone();
}

 

Screenshot from 2017-09-03 18-35-06.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×