Commit e52c4dbe authored by Pavel Rojtberg's avatar Pavel Rojtberg Committed by Pavel Rojtberg

ovis: replace renderOneFrame by waitKey for consistency with highgui

also set the intrinsic in the AR demo
parent 30567982
...@@ -116,7 +116,7 @@ public: ...@@ -116,7 +116,7 @@ public:
InputArray rot = noArray(), bool invert = false) = 0; InputArray rot = noArray(), bool invert = false) = 0;
/** /**
* read back image of last call to @ref renderOneFrame * read back the image generated by the last call to @ref waitKey
*/ */
CV_WRAP virtual void getScreenshot(OutputArray frame) = 0; CV_WRAP virtual void getScreenshot(OutputArray frame) = 0;
...@@ -181,10 +181,13 @@ CV_EXPORTS_W Ptr<WindowScene> createWindow(const String& title, const Size& size ...@@ -181,10 +181,13 @@ CV_EXPORTS_W Ptr<WindowScene> createWindow(const String& title, const Size& size
int flags = SCENE_INTERACTIVE); int flags = SCENE_INTERACTIVE);
/** /**
* update all windows * update all windows and wait for keyboard event
* @return true if this functian can be called again (i.e. continue rendering). false otherwise. *
* @param delay 0 is the special value that means "forever".
* Any positive number returns after sync to blank (typically 16ms).
* @return the code of the pressed key or -1 if no key was pressed
*/ */
CV_EXPORTS_W bool renderOneFrame(); CV_EXPORTS_W int waitKey(int delay = 0);
/** /**
* set the property of a material to the given value * set the property of a material to the given value
......
...@@ -13,6 +13,7 @@ K = cv.getDefaultNewCameraMatrix(np.diag([800, 800, 1]), imsize, True) ...@@ -13,6 +13,7 @@ K = cv.getDefaultNewCameraMatrix(np.diag([800, 800, 1]), imsize, True)
cv.ovis.addResourceLocation("packs/Sinbad.zip") # shipped with Ogre cv.ovis.addResourceLocation("packs/Sinbad.zip") # shipped with Ogre
win = cv.ovis.createWindow("arucoAR", imsize, flags=0) win = cv.ovis.createWindow("arucoAR", imsize, flags=0)
win.setCameraIntrinsics(K, imsize)
win.createEntity("figure", "Sinbad.mesh", (0, 0, -5), (-1.57, 0, 0)) win.createEntity("figure", "Sinbad.mesh", (0, 0, -5), (-1.57, 0, 0))
win.createLightEntity("sun", (0, 0, -100)) win.createLightEntity("sun", (0, 0, -100))
...@@ -21,7 +22,7 @@ cap = cv.VideoCapture(0) ...@@ -21,7 +22,7 @@ cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_WIDTH, imsize[0]) cap.set(cv.CAP_PROP_FRAME_WIDTH, imsize[0])
cap.set(cv.CAP_PROP_FRAME_HEIGHT, imsize[1]) cap.set(cv.CAP_PROP_FRAME_HEIGHT, imsize[1])
while cv.ovis.renderOneFrame(): while cv.ovis.waitKey(1) != 27:
img = cap.read()[1] img = cap.read()[1]
win.setBackground(img) win.setBackground(img)
corners, ids = cv.aruco.detectMarkers(img, adict)[:2] corners, ids = cv.aruco.detectMarkers(img, adict)[:2]
......
...@@ -23,6 +23,6 @@ iwin.createEntity("figure", "Sinbad.mesh", (0, -5, 0)) ...@@ -23,6 +23,6 @@ iwin.createEntity("figure", "Sinbad.mesh", (0, -5, 0))
iwin.createLightEntity("sun", (0, 0, -100)) iwin.createLightEntity("sun", (0, 0, -100))
iwin.setCameraIntrinsics(K, imsize) iwin.setCameraIntrinsics(K, imsize)
while cv.ovis.renderOneFrame(): while cv.ovis.waitKey(1) != 27:
R, t = iwin.getCameraPose() R, t = iwin.getCameraPose()
owin.setEntityPose("cam", t, R) owin.setEntityPose("cam", t, R)
...@@ -136,17 +136,18 @@ static SceneNode* _getSceneNode(SceneManager* sceneMgr, const String& name) ...@@ -136,17 +136,18 @@ static SceneNode* _getSceneNode(SceneManager* sceneMgr, const String& name)
return mo->getParentSceneNode(); return mo->getParentSceneNode();
} }
struct Application : public OgreBites::ApplicationContext struct Application : public OgreBites::ApplicationContext, public OgreBites::InputListener
{ {
Ptr<LogManager> logMgr; Ptr<LogManager> logMgr;
Ogre::SceneManager* sceneMgr; Ogre::SceneManager* sceneMgr;
Ogre::String title; Ogre::String title;
uint32_t w; uint32_t w;
uint32_t h; uint32_t h;
int key_pressed;
Application(const Ogre::String& _title, const Size& sz) Application(const Ogre::String& _title, const Size& sz)
: OgreBites::ApplicationContext("ovis", false), sceneMgr(NULL), title(_title), w(sz.width), : OgreBites::ApplicationContext("ovis", false), sceneMgr(NULL), title(_title), w(sz.width),
h(sz.height) h(sz.height), key_pressed(-1)
{ {
logMgr.reset(new LogManager()); logMgr.reset(new LogManager());
logMgr->createLog("ovis.log", true, true, true); logMgr->createLog("ovis.log", true, true, true);
...@@ -158,6 +159,12 @@ struct Application : public OgreBites::ApplicationContext ...@@ -158,6 +159,12 @@ struct Application : public OgreBites::ApplicationContext
// empty impl to show cursor // empty impl to show cursor
} }
bool keyPressed(const OgreBites::KeyboardEvent& evt)
{
key_pressed = evt.keysym.sym;
return true;
}
bool oneTimeConfig() bool oneTimeConfig()
{ {
Ogre::RenderSystem* rs = getRoot()->getRenderSystemByName(RENDERSYSTEM_NAME); Ogre::RenderSystem* rs = getRoot()->getRenderSystemByName(RENDERSYSTEM_NAME);
...@@ -179,7 +186,11 @@ struct Application : public OgreBites::ApplicationContext ...@@ -179,7 +186,11 @@ struct Application : public OgreBites::ApplicationContext
miscParams["FSAA"] = "4"; miscParams["FSAA"] = "4";
miscParams["vsync"] = "true"; miscParams["vsync"] = "true";
return OgreBites::ApplicationContext::createWindow(_name, _w, _h, miscParams); OgreBites::NativeWindowPair ret =
OgreBites::ApplicationContext::createWindow(_name, _w, _h, miscParams);
addInputListener(ret.native, this); // handle input for all windows
return ret;
} }
void locateResources() void locateResources()
...@@ -212,7 +223,7 @@ struct Application : public OgreBites::ApplicationContext ...@@ -212,7 +223,7 @@ struct Application : public OgreBites::ApplicationContext
} }
}; };
class WindowSceneImpl : public WindowScene, public OgreBites::InputListener class WindowSceneImpl : public WindowScene
{ {
String title; String title;
Root* root; Root* root;
...@@ -266,8 +277,6 @@ public: ...@@ -266,8 +277,6 @@ public:
{ {
app->sceneMgr = sceneMgr; app->sceneMgr = sceneMgr;
rWin = app->getRenderWindow(); rWin = app->getRenderWindow();
app->addInputListener(this);
if (camman) if (camman)
app->addInputListener(camman.get()); app->addInputListener(camman.get());
} }
...@@ -277,8 +286,6 @@ public: ...@@ -277,8 +286,6 @@ public:
rWin = nwin.render; rWin = nwin.render;
if (camman) if (camman)
app->addInputListener(nwin.native, camman.get()); app->addInputListener(nwin.native, camman.get());
app->addInputListener(nwin.native, this);
} }
rWin->addViewport(cam); rWin->addViewport(cam);
...@@ -421,14 +428,6 @@ public: ...@@ -421,14 +428,6 @@ public:
rWin->copyContentsToMemory(pb, pb); rWin->copyContentsToMemory(pb, pb);
} }
bool keyPressed(const OgreBites::KeyboardEvent& evt)
{
if (evt.keysym.sym == SDLK_ESCAPE)
root->queueEndRendering();
return true;
}
void fixCameraYawAxis(bool useFixed, InputArray _up) void fixCameraYawAxis(bool useFixed, InputArray _up)
{ {
Vector3 up = Vector3::UNIT_Y; Vector3 up = Vector3::UNIT_Y;
...@@ -527,12 +526,18 @@ Ptr<WindowScene> createWindow(const String& title, const Size& size, int flags) ...@@ -527,12 +526,18 @@ Ptr<WindowScene> createWindow(const String& title, const Size& size, int flags)
return makePtr<WindowSceneImpl>(_app, title, size, flags); return makePtr<WindowSceneImpl>(_app, title, size, flags);
} }
CV_EXPORTS_W bool renderOneFrame() CV_EXPORTS_W int waitKey(int delay)
{ {
CV_Assert(_app); CV_Assert(_app);
_app->key_pressed = -1;
_app->getRoot()->renderOneFrame(); _app->getRoot()->renderOneFrame();
return not _app->getRoot()->endRenderingQueued();
// wait for keypress, using vsync instead of sleep
while(!delay && _app->key_pressed == -1)
_app->getRoot()->renderOneFrame();
return (_app->key_pressed != -1) ? (_app->key_pressed & 0xff) : -1;
} }
void setMaterialProperty(const String& name, int prop, const Scalar& val) void setMaterialProperty(const String& name, int prop, const Scalar& val)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment