updated OpenGL functionality:
* removed OpenGLFuncTab, now extensions are loaded internally * added support of GlBuffer and GlTexture2D to InputArray/OutputArray * added ELEMENT_ARRAY_BUFFER and PIXEL_PACK_BUFFER targets * added copyFrom/copyTo method for GlBuffer and GlTexture2D * removed GlFont * removed pointCloudShow * removed OpenGLCleanCallback * added Access parameter to GlBuffer::mapHost * added autoRelease parameter to all create methods
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
|
||||
#include "cvconfig.h"
|
||||
#include "opencv2/core/core.hpp"
|
||||
#include "opencv2/core/opengl_interop.hpp"
|
||||
#include "opencv2/highgui/highgui.hpp"
|
||||
#include "opencv2/gpu/gpu.hpp"
|
||||
|
||||
@@ -14,12 +13,6 @@ using namespace cv::gpu;
|
||||
|
||||
void getFlowField(const Mat& u, const Mat& v, Mat& flowField);
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
|
||||
void needleMapDraw(void* userdata);
|
||||
|
||||
#endif
|
||||
|
||||
int main(int argc, const char* argv[])
|
||||
{
|
||||
try
|
||||
@@ -80,12 +73,8 @@ int main(int argc, const char* argv[])
|
||||
namedWindow("Forward flow");
|
||||
namedWindow("Backward flow");
|
||||
|
||||
namedWindow("Needle Map", WINDOW_OPENGL);
|
||||
|
||||
namedWindow("Interpolated frame");
|
||||
|
||||
setGlDevice();
|
||||
|
||||
cout << "Press:" << endl;
|
||||
cout << "\tESC to quit" << endl;
|
||||
cout << "\t'a' to move to the previous frame" << endl;
|
||||
@@ -124,14 +113,6 @@ int main(int argc, const char* argv[])
|
||||
Mat flowFieldBackward;
|
||||
getFlowField(Mat(d_bu), Mat(d_bv), flowFieldBackward);
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
cout << "Create Optical Flow Needle Map..." << endl;
|
||||
|
||||
GpuMat d_vertex, d_colors;
|
||||
|
||||
createOpticalFlowNeedleMap(d_fu, d_fv, d_vertex, d_colors);
|
||||
#endif
|
||||
|
||||
cout << "Interpolating..." << endl;
|
||||
|
||||
// first frame color components
|
||||
@@ -196,14 +177,6 @@ int main(int argc, const char* argv[])
|
||||
imshow("Forward flow", flowFieldForward);
|
||||
imshow("Backward flow", flowFieldBackward);
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
GlArrays arr;
|
||||
arr.setVertexArray(d_vertex);
|
||||
arr.setColorArray(d_colors, false);
|
||||
|
||||
setOpenGlDrawCallback("Needle Map", needleMapDraw, &arr);
|
||||
#endif
|
||||
|
||||
int currentFrame = 0;
|
||||
|
||||
imshow("Interpolated frame", frames[currentFrame]);
|
||||
@@ -292,22 +265,4 @@ void getFlowField(const Mat& u, const Mat& v, Mat& flowField)
|
||||
row[j][3] = 255;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
|
||||
void needleMapDraw(void* userdata)
|
||||
{
|
||||
const GlArrays* arr = static_cast<const GlArrays*>(userdata);
|
||||
|
||||
GlCamera camera;
|
||||
camera.setOrthoProjection(0.0, 1.0, 1.0, 0.0, 0.0, 1.0);
|
||||
camera.lookAt(Point3d(0.0, 0.0, 1.0), Point3d(0.0, 0.0, 0.0), Point3d(0.0, 1.0, 0.0));
|
||||
|
||||
camera.setupProjectionMatrix();
|
||||
camera.setupModelViewMatrix();
|
||||
|
||||
render(*arr, RenderMode::TRIANGLES);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
@@ -1,135 +0,0 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include "opencv2/core/core.hpp"
|
||||
#include "opencv2/core/gpumat.hpp"
|
||||
#include "opencv2/core/opengl_interop.hpp"
|
||||
#include "opencv2/gpu/gpu.hpp"
|
||||
#include "opencv2/highgui/highgui.hpp"
|
||||
#include "opencv2/contrib/contrib.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace cv::gpu;
|
||||
|
||||
struct Timer
|
||||
{
|
||||
Timer(const string& msg_)
|
||||
{
|
||||
msg = msg_;
|
||||
|
||||
tm.reset();
|
||||
tm.start();
|
||||
}
|
||||
|
||||
~Timer()
|
||||
{
|
||||
tm.stop();
|
||||
cout << msg << " " << tm.getTimeMilli() << " ms\n";
|
||||
}
|
||||
|
||||
string msg;
|
||||
TickMeter tm;
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
cout << "Usage: " << argv[0] << " image" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
bool haveCuda = getCudaEnabledDeviceCount() > 0;
|
||||
|
||||
const string openGlMatWnd = "OpenGL Mat";
|
||||
const string openGlBufferWnd = "OpenGL GlBuffer";
|
||||
const string openGlTextureWnd = "OpenGL GlTexture";
|
||||
const string openGlGpuMatWnd = "OpenGL GpuMat";
|
||||
const string matWnd = "Mat";
|
||||
|
||||
namedWindow(openGlMatWnd, WINDOW_OPENGL | WINDOW_AUTOSIZE);
|
||||
namedWindow(openGlBufferWnd, WINDOW_OPENGL | WINDOW_AUTOSIZE);
|
||||
namedWindow(openGlTextureWnd, WINDOW_OPENGL | WINDOW_AUTOSIZE);
|
||||
if (haveCuda)
|
||||
namedWindow(openGlGpuMatWnd, WINDOW_OPENGL | WINDOW_AUTOSIZE);
|
||||
namedWindow("Mat", WINDOW_AUTOSIZE);
|
||||
|
||||
Mat img = imread(argv[1]);
|
||||
|
||||
if (haveCuda)
|
||||
setGlDevice();
|
||||
|
||||
setOpenGlContext(openGlBufferWnd);
|
||||
GlBuffer buf(img, GlBuffer::TEXTURE_BUFFER);
|
||||
|
||||
setOpenGlContext(openGlTextureWnd);
|
||||
GlTexture tex(img);
|
||||
|
||||
GpuMat d_img;
|
||||
if (haveCuda)
|
||||
d_img.upload(img);
|
||||
|
||||
cout << "=== First call\n\n";
|
||||
|
||||
{
|
||||
Timer t("OpenGL Mat ");
|
||||
imshow(openGlMatWnd, img);
|
||||
}
|
||||
{
|
||||
Timer t("OpenGL GlBuffer ");
|
||||
imshow(openGlBufferWnd, buf);
|
||||
}
|
||||
{
|
||||
Timer t("OpenGL GlTexture");
|
||||
imshow(openGlTextureWnd, tex);
|
||||
}
|
||||
if (haveCuda)
|
||||
{
|
||||
Timer t("OpenGL GpuMat ");
|
||||
imshow(openGlGpuMatWnd, d_img);
|
||||
}
|
||||
{
|
||||
Timer t("Mat ");
|
||||
imshow(matWnd, img);
|
||||
}
|
||||
|
||||
waitKey();
|
||||
|
||||
cout << "\n=== Second call\n\n";
|
||||
|
||||
{
|
||||
Timer t("OpenGL Mat ");
|
||||
imshow(openGlMatWnd, img);
|
||||
}
|
||||
{
|
||||
Timer t("OpenGL GlBuffer ");
|
||||
imshow(openGlBufferWnd, buf);
|
||||
}
|
||||
{
|
||||
Timer t("OpenGL GlTexture");
|
||||
imshow(openGlTextureWnd, tex);
|
||||
}
|
||||
if (haveCuda)
|
||||
{
|
||||
Timer t("OpenGL GpuMat ");
|
||||
imshow(openGlGpuMatWnd, d_img);
|
||||
}
|
||||
{
|
||||
Timer t("Mat ");
|
||||
imshow(matWnd, img);
|
||||
}
|
||||
|
||||
cout << "\n";
|
||||
|
||||
waitKey();
|
||||
}
|
||||
catch(const exception& e)
|
||||
{
|
||||
cout << e.what() << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
125
samples/gpu/opengl.cpp
Normal file
125
samples/gpu/opengl.cpp
Normal file
@@ -0,0 +1,125 @@
|
||||
#include <iostream>
|
||||
#include "cvconfig.h"
|
||||
|
||||
#ifndef HAVE_OPENGL
|
||||
int main()
|
||||
{
|
||||
std::cerr << "Library was built without OpenGL support" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
|
||||
#ifdef WIN32
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#define NOMINMAX 1
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <OpenGL/gl.h>
|
||||
#include <OpenGL/glu.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
#endif
|
||||
|
||||
#include "opencv2/core/core.hpp"
|
||||
#include "opencv2/core/opengl_interop.hpp"
|
||||
#include "opencv2/core/gpumat.hpp"
|
||||
#include "opencv2/highgui/highgui.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace cv::gpu;
|
||||
|
||||
const int win_width = 800;
|
||||
const int win_height = 640;
|
||||
|
||||
struct DrawData
|
||||
{
|
||||
GlArrays arr;
|
||||
GlTexture tex;
|
||||
GlBuffer indices;
|
||||
};
|
||||
|
||||
void CV_CDECL draw(void* userdata);
|
||||
|
||||
void CV_CDECL draw(void* userdata)
|
||||
{
|
||||
static double angle = 0.0;
|
||||
|
||||
DrawData* data = static_cast<DrawData*>(userdata);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(45.0, (double)win_width / win_height, 0.1, 100.0);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);
|
||||
glRotated(angle, 0, 1, 0);
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
data->tex.bind();
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
|
||||
render(data->arr, data->indices, RenderMode::TRIANGLES);
|
||||
|
||||
angle += 0.3;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
cout << "Usage: " << argv[0] << " image" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
Mat img = imread(argv[1]);
|
||||
if (img.empty())
|
||||
{
|
||||
cerr << "Can't open image " << argv[1] << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
namedWindow("OpenGL", WINDOW_OPENGL);
|
||||
resizeWindow("OpenGL", win_width, win_height);
|
||||
|
||||
Mat_<Vec2f> vertex(1, 4);
|
||||
vertex << Vec2f(-1, 1), Vec2f(-1, -1), Vec2f(1, -1), Vec2f(1, 1);
|
||||
|
||||
Mat_<Vec2f> texCoords(1, 4);
|
||||
texCoords << Vec2f(0, 0), Vec2f(0, 1), Vec2f(1, 1), Vec2f(1, 0);
|
||||
|
||||
Mat_<int> indices(1, 6);
|
||||
indices << 0, 1, 2, 2, 3, 0;
|
||||
|
||||
DrawData data;
|
||||
|
||||
data.arr.setVertexArray(vertex);
|
||||
data.arr.setTexCoordArray(texCoords);
|
||||
data.indices.copyFrom(indices);
|
||||
data.tex.copyFrom(img);
|
||||
|
||||
setOpenGlDrawCallback("OpenGL", draw, &data);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
updateWindow("OpenGL");
|
||||
int key = waitKey(10);
|
||||
if ((key & 0xff) == 27)
|
||||
break;
|
||||
}
|
||||
|
||||
setOpenGlDrawCallback("OpenGL", 0, 0);
|
||||
destroyAllWindows();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
@@ -3,7 +3,6 @@
|
||||
|
||||
#include "cvconfig.h"
|
||||
#include "opencv2/core/core.hpp"
|
||||
#include "opencv2/core/opengl_interop.hpp"
|
||||
#include "opencv2/imgproc/imgproc.hpp"
|
||||
#include "opencv2/highgui/highgui.hpp"
|
||||
#include "opencv2/video/video.hpp"
|
||||
@@ -66,40 +65,6 @@ static void drawArrows(Mat& frame, const vector<Point2f>& prevPts, const vector<
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
|
||||
struct DrawData
|
||||
{
|
||||
GlTexture tex;
|
||||
GlArrays arr;
|
||||
};
|
||||
|
||||
static void drawCallback(void* userdata)
|
||||
{
|
||||
DrawData* data = static_cast<DrawData*>(userdata);
|
||||
|
||||
if (data->tex.empty() || data->arr.empty())
|
||||
return;
|
||||
|
||||
static GlCamera camera;
|
||||
static bool init_camera = true;
|
||||
|
||||
if (init_camera)
|
||||
{
|
||||
camera.setOrthoProjection(0.0, 1.0, 1.0, 0.0, 0.0, 1.0);
|
||||
camera.lookAt(Point3d(0.0, 0.0, 1.0), Point3d(0.0, 0.0, 0.0), Point3d(0.0, 1.0, 0.0));
|
||||
init_camera = false;
|
||||
}
|
||||
|
||||
camera.setupProjectionMatrix();
|
||||
camera.setupModelViewMatrix();
|
||||
|
||||
render(data->tex);
|
||||
render(data->arr, RenderMode::TRIANGLES);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
template <typename T> inline T clamp (T x, T a, T b)
|
||||
{
|
||||
return ((x) > (a) ? ((x) < (b) ? (x) : (b)) : (a));
|
||||
@@ -200,12 +165,6 @@ int main(int argc, const char* argv[])
|
||||
namedWindow("PyrLK [Sparse]", WINDOW_NORMAL);
|
||||
namedWindow("PyrLK [Dense] Flow Field", WINDOW_NORMAL);
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
namedWindow("PyrLK [Dense]", WINDOW_OPENGL);
|
||||
|
||||
setGlDevice();
|
||||
#endif
|
||||
|
||||
cout << "Image size : " << frame0.cols << " x " << frame0.rows << endl;
|
||||
cout << "Points count : " << points << endl;
|
||||
|
||||
@@ -271,21 +230,6 @@ int main(int argc, const char* argv[])
|
||||
|
||||
imshow("PyrLK [Dense] Flow Field", flowField);
|
||||
|
||||
#ifdef HAVE_OPENGL
|
||||
setOpenGlContext("PyrLK [Dense]");
|
||||
|
||||
GpuMat d_vertex, d_colors;
|
||||
createOpticalFlowNeedleMap(d_u, d_v, d_vertex, d_colors);
|
||||
|
||||
DrawData drawData;
|
||||
|
||||
drawData.tex.copyFrom(d_frame0Gray);
|
||||
drawData.arr.setVertexArray(d_vertex);
|
||||
drawData.arr.setColorArray(d_colors, false);
|
||||
|
||||
setOpenGlDrawCallback("PyrLK [Dense]", drawCallback, &drawData);
|
||||
#endif
|
||||
|
||||
waitKey();
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user