Tlya 1 Жалоба Опубликовано September 1, 2017 Доброго времени!) Есть задача написать плеер для проигрывания видео 360. (В идеале на два глаза, но для начала пойдет и на 1 ) Понятное дело, что никто за меня это делать не будет, поэтому прошу сугубо совета. В сторону каких функций в опенсв стоит смотреть, есть ли в ней (библиотеке) подходящие инструменты для данной задачи? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано September 1, 2017 А если быть точнее, как натягивать видео на сферу? (это если уж совсем просто выражаясь ) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано September 2, 2017 Думаю тут больше OpenGL подходит, там вообще с текстурами проблем не будет, да и всякие cubemap-ы есть со sky box-ами, ну и аппаратное ускорение тоже штука не лишняя. Еще тут посмотрите: http://proj4.org/projections/qsc.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано September 3, 2017 А подскажите тогда, пожалуйста, как в opencv сделать эффект лупы? (выпуклой или "впуклой" не важно) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано September 3, 2017 Да тут то все просто. #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); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано September 3, 2017 Большое спасибо!) Вы тут использовали функцию, можно сказать написанную вручную, а есть ли какая-нибудь опеновская готовая? И еще, можно ли как-то сблурить образовавшиеся при растяжении квадраты? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано September 3, 2017 Нет, опенсвшной фунуции нет. Интерполяцию можно написать чтобы квадраты сгладить. Можно просто увеличить изображение перед тем как применять эффект линзы и брать пиксели уже с увеличенного изображения, соответственно нужно подправить коэффициенты. Можно еще 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(); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах