From 8340e31f1f529367417bb84da764e902af604815 Mon Sep 17 00:00:00 2001 From: Alexander Bohn / FI$H2k Date: Tue, 11 Nov 2014 04:35:35 -0800 Subject: [PATCH 1/4] Fixed OS X compilation error in window_cocoa.mm Un-commented `NSApplicationActivationPolicyRegular` argument (in leu of zero) and got rid of problematic dereference --- modules/highgui/src/window_cocoa.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/highgui/src/window_cocoa.mm b/modules/highgui/src/window_cocoa.mm index fca6ff9393..fbf3a54567 100644 --- a/modules/highgui/src/window_cocoa.mm +++ b/modules/highgui/src/window_cocoa.mm @@ -150,7 +150,7 @@ CV_IMPL int cvInitSystem( int , char** ) #define NSAppKitVersionNumber10_5 949 #endif if( floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5 ) - [application setActivationPolicy:0/*NSApplicationActivationPolicyRegular*/]; + [application setActivationPolicy:NSApplicationActivationPolicyRegular]; #endif //[application finishLaunching]; //atexit(icvCocoaCleanup); From b3a60b9c22118f34f03f57fb4b432f809ebe2639 Mon Sep 17 00:00:00 2001 From: eltermann Date: Tue, 11 Nov 2014 17:10:33 -0200 Subject: [PATCH 2/4] Documentation fix on py_tutorials/py_feature2d --- .../py_feature2d/py_features_meaning/py_features_meaning.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/py_tutorials/py_feature2d/py_features_meaning/py_features_meaning.rst b/doc/py_tutorials/py_feature2d/py_features_meaning/py_features_meaning.rst index bfd03c0303..d81fbc8052 100644 --- a/doc/py_tutorials/py_feature2d/py_features_meaning/py_features_meaning.rst +++ b/doc/py_tutorials/py_feature2d/py_features_meaning/py_features_meaning.rst @@ -13,7 +13,7 @@ Explanation Most of you will have played the jigsaw puzzle games. You get a lot of small pieces of a images, where you need to assemble them correctly to form a big real image. **The question is, how you do it?** What about the projecting the same theory to a computer program so that computer can play jigsaw puzzles? If the computer can play jigsaw puzzles, why can't we give a lot of real-life images of a good natural scenery to computer and tell it to stitch all those images to a big single image? If the computer can stitch several natural images to one, what about giving a lot of pictures of a building or any structure and tell computer to create a 3D model out of it? -Well, the questions and imaginations continue. But it all depends on the most basic question? How do you play jigsaw puzzles? How do you arrange lots of scrambled image pieces into a big single image? How can you stitch a lot of natural images to a single image? +Well, the questions and imaginations continue. But it all depends on the most basic question: How do you play jigsaw puzzles? How do you arrange lots of scrambled image pieces into a big single image? How can you stitch a lot of natural images to a single image? The answer is, we are looking for specific patterns or specific features which are unique, which can be easily tracked, which can be easily compared. If we go for a definition of such a feature, we may find it difficult to express it in words, but we know what are they. If some one asks you to point out one good feature which can be compared across several images, you can point out one. That is why, even small children can simply play these games. We search for these features in an image, we find them, we find the same features in other images, we align them. That's it. (In jigsaw puzzle, we look more into continuity of different images). All these abilities are present in us inherently. From 174409843874546f4a825ffa496ed748c9bcf8d4 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 18 Nov 2014 15:39:59 +0300 Subject: [PATCH 3/4] silence cmake 3.0+ warnings on LOCATION attribute --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e61b65b1d..efe56c1693 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,11 @@ if(POLICY CMP0022) cmake_policy(SET CMP0022 OLD) endif() +if(POLICY CMP0026) + # silence cmake 3.0+ warnings about reading LOCATION attribute + cmake_policy(SET CMP0026 OLD) +endif() + # must go before the project command set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE) if(DEFINED CMAKE_BUILD_TYPE) From f4ba8b13c7f94693ce8b0a1b9d45499449536862 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 18 Nov 2014 02:27:02 +0300 Subject: [PATCH 4/4] Add cv::setWindowTitle to highgui --- modules/highgui/include/opencv2/highgui.hpp | 2 + modules/highgui/src/window.cpp | 9 ++++- modules/highgui/src/window_QT.cpp | 43 +++++++++++++++++---- modules/highgui/src/window_QT.h | 1 + modules/highgui/src/window_carbon.cpp | 17 ++++++++ modules/highgui/src/window_cocoa.mm | 21 ++++++++++ modules/highgui/src/window_gtk.cpp | 17 ++++++++ modules/highgui/src/window_w32.cpp | 17 ++++++++ 8 files changed, 118 insertions(+), 9 deletions(-) diff --git a/modules/highgui/include/opencv2/highgui.hpp b/modules/highgui/include/opencv2/highgui.hpp index aef9105f74..41b8cd8011 100644 --- a/modules/highgui/include/opencv2/highgui.hpp +++ b/modules/highgui/include/opencv2/highgui.hpp @@ -136,6 +136,8 @@ CV_EXPORTS_W void moveWindow(const String& winname, int x, int y); CV_EXPORTS_W void setWindowProperty(const String& winname, int prop_id, double prop_value); +CV_EXPORTS_W void setWindowTitle(const String& winname, const String& title); + CV_EXPORTS_W double getWindowProperty(const String& winname, int prop_id); //! assigns callback for mouse events diff --git a/modules/highgui/src/window.cpp b/modules/highgui/src/window.cpp index 03ff988d7b..e3c997c08e 100644 --- a/modules/highgui/src/window.cpp +++ b/modules/highgui/src/window.cpp @@ -379,7 +379,8 @@ CV_IMPL void cvUpdateWindow(const char*) cv::QtFont cv::fontQt(const String& nameFont, int pointSize, Scalar color, int weight, int style, int /*spacing*/) { CvFont f = cvFontQt(nameFont.c_str(), pointSize,color,weight, style); - return *(cv::QtFont*)(&f); + void* pf = &f; // to suppress strict-aliasing + return *(cv::QtFont*)pf; } void cv::addText( const Mat& img, const String& text, Point org, const QtFont& font) @@ -490,6 +491,12 @@ int cv::createButton(const String&, ButtonCallback, void*, int , bool ) // version with a more capable one without a need to recompile dependent // applications or libraries. +void cv::setWindowTitle(const String&, const String&) +{ + CV_Error(Error::StsNotImplemented, "The function is not implemented. " + "Rebuild the library with Windows, GTK+ 2.x or Carbon support. " + "If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script"); +} #define CV_NO_GUI_ERROR(funcname) \ cvError( CV_StsError, funcname, \ diff --git a/modules/highgui/src/window_QT.cpp b/modules/highgui/src/window_QT.cpp index f67c2f6731..fc94dedfbb 100644 --- a/modules/highgui/src/window_QT.cpp +++ b/modules/highgui/src/window_QT.cpp @@ -181,6 +181,18 @@ void cvSetPropWindow_QT(const char* name,double prop_value) Q_ARG(double, prop_value)); } +void cv::setWindowTitle(const String& winname, const String& title) +{ + if (!guiMainThread) + CV_Error(Error::StsNullPtr, "NULL guiReceiver (please create a window)"); + + QMetaObject::invokeMethod(guiMainThread, + "setWindowTitle", + autoBlockingConnection(), + Q_ARG(QString, QString(winname.c_str())), + Q_ARG(QString, QString(title.c_str()))); +} + void cvSetModeWindow_QT(const char* name, double prop_value) { @@ -371,7 +383,7 @@ static CvWindow* icvFindWindowByName(QString name) if (temp->type == type_CvWindow) { CvWindow* w = (CvWindow*) temp; - if (w->windowTitle() == name) + if (w->objectName() == name) { window = w; break; @@ -527,7 +539,7 @@ CV_IMPL const char* cvGetWindowName(void* window_handle) if( !window_handle ) CV_Error( CV_StsNullPtr, "NULL window handler" ); - return ((CvWindow*)window_handle)->windowTitle().toLatin1().data(); + return ((CvWindow*)window_handle)->objectName().toLatin1().data(); } @@ -871,6 +883,22 @@ void GuiReceiver::setPropWindow(QString name, double arg2) w->setPropWindow(flags); } +void GuiReceiver::setWindowTitle(QString name, QString title) +{ + QPointer w = icvFindWindowByName(name); + + if (!w) + { + cvNamedWindow(name.toLatin1().data()); + w = icvFindWindowByName(name); + } + + if (!w) + return; + + w->setWindowTitle(title); +} + double GuiReceiver::isFullScreen(QString name) { @@ -1494,7 +1522,7 @@ void CvWinProperties::showEvent(QShowEvent* evnt) //no value pos was saved so we let Qt move the window in the middle of its parent (event ignored). //then hide will save the last position and thus, we want to retreive it (event accepted). QPoint mypos(-1, -1); - QSettings settings("OpenCV2", windowTitle()); + QSettings settings("OpenCV2", objectName()); mypos = settings.value("pos", mypos).toPoint(); if (mypos.x() >= 0) @@ -1511,7 +1539,7 @@ void CvWinProperties::showEvent(QShowEvent* evnt) void CvWinProperties::hideEvent(QHideEvent* evnt) { - QSettings settings("OpenCV2", windowTitle()); + QSettings settings("OpenCV2", objectName()); settings.setValue("pos", pos()); //there is an offset of 6 pixels (so the window's position is wrong -- why ?) evnt->accept(); } @@ -1520,7 +1548,7 @@ void CvWinProperties::hideEvent(QHideEvent* evnt) CvWinProperties::~CvWinProperties() { //clear the setting pos - QSettings settings("OpenCV2", windowTitle()); + QSettings settings("OpenCV2", objectName()); settings.remove("pos"); } @@ -1540,9 +1568,9 @@ CvWindow::CvWindow(QString name, int arg2) //setAttribute(Qt::WA_DeleteOnClose); //in other case, does not release memory setContentsMargins(0, 0, 0, 0); setWindowTitle(name); - setObjectName(name); + setObjectName(name); - setFocus( Qt::PopupFocusReason ); //#1695 arrow keys are not received without the explicit focus + setFocus( Qt::PopupFocusReason ); //#1695 arrow keys are not received without the explicit focus resize(400, 300); setMinimumSize(1, 1); @@ -1702,7 +1730,6 @@ void CvWindow::setPropWindow(int flags) } } - void CvWindow::toggleFullScreen(int flags) { if (isFullScreen() && flags == CV_WINDOW_NORMAL) diff --git a/modules/highgui/src/window_QT.h b/modules/highgui/src/window_QT.h index a96a8c6e69..20cd4142ab 100644 --- a/modules/highgui/src/window_QT.h +++ b/modules/highgui/src/window_QT.h @@ -132,6 +132,7 @@ public slots: double isFullScreen(QString name); double getPropWindow(QString name); void setPropWindow(QString name, double flags ); + void setWindowTitle(QString name, QString title); double getRatioWindow(QString name); void setRatioWindow(QString name, double arg2 ); void saveWindowParameters(QString name); diff --git a/modules/highgui/src/window_carbon.cpp b/modules/highgui/src/window_carbon.cpp index 3d092e736e..93d9e4f7aa 100644 --- a/modules/highgui/src/window_carbon.cpp +++ b/modules/highgui/src/window_carbon.cpp @@ -833,6 +833,23 @@ void cvSetModeWindow_CARBON( const char* name, double prop_value)//Yannick Verdi __END__; } +void cv::setWindowTitle(const String& winname, const String& title) +{ + CvWindow* window = icvFindWindowByName(winname.c_str()); + + if (!window) + { + namedWindow(winname); + window = icvFindWindowByName(winname.c_str()); + } + + if (!window) + CV_Error(Error::StsNullPtr, "NULL window"); + + if (noErr != SetWindowTitleWithCFString(window->window, CFStringCreateWithCString(NULL, title.c_str(), kCFStringEncodingASCII))) + CV_Error_(Error::StsError, ("Failed to set \"%s\" window title to \"%s\"", winname.c_str(), title.c_str())); +} + CV_IMPL int cvNamedWindow( const char* name, int flags ) { int result = 0; diff --git a/modules/highgui/src/window_cocoa.mm b/modules/highgui/src/window_cocoa.mm index fca6ff9393..977d61924c 100644 --- a/modules/highgui/src/window_cocoa.mm +++ b/modules/highgui/src/window_cocoa.mm @@ -603,6 +603,27 @@ void cvSetModeWindow_COCOA( const char* name, double prop_value ) __END__; } +void cv::setWindowTitle(const String& winname, const String& title) +{ + CVWindow *window = cvGetWindow(winname.c_str()); + + if (window == NULL) + { + namedWindow(winname); + window = cvGetWindow(winname.c_str()); + } + + if (window == NULL) + CV_Error(Error::StsNullPtr, "NULL window"); + + NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; + + NSString *windowTitle = [NSString stringWithFormat:@"%s", title.c_str()]; + [window setTitle:windowTitle]; + + [localpool drain]; +} + @implementation CVWindow @synthesize mouseCallback; diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index 0d53276b8d..4b916e6487 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -732,6 +732,23 @@ void cvSetModeWindow_GTK( const char* name, double prop_value)//Yannick Verdie __END__; } +void cv::setWindowTitle(const String& winname, const String& title) +{ + CvWindow* window = icvFindWindowByName(winname.c_str()); + + if (!window) + { + namedWindow(winname); + window = icvFindWindowByName(winname.c_str()); + } + + if (!window) + CV_Error(Error::StsNullPtr, "NULL window"); + + CV_LOCK_MUTEX(); + gtk_window_set_title(GTK_WINDOW(window->frame), title.c_str()); + CV_UNLOCK_MUTEX(); +} double cvGetPropWindowAutoSize_GTK(const char* name) { diff --git a/modules/highgui/src/window_w32.cpp b/modules/highgui/src/window_w32.cpp index bcf1bae8be..8e8c766e5f 100644 --- a/modules/highgui/src/window_w32.cpp +++ b/modules/highgui/src/window_w32.cpp @@ -483,6 +483,23 @@ void cvSetModeWindow_W32( const char* name, double prop_value)//Yannick Verdie __END__; } +void cv::setWindowTitle(const String& winname, const String& title) +{ + CvWindow* window = icvFindWindowByName(winname.c_str()); + + if (!window) + { + namedWindow(winname); + window = icvFindWindowByName(winname.c_str()); + } + + if (!window) + CV_Error(Error::StsNullPtr, "NULL window"); + + if (!SetWindowText(window->frame, title.c_str())) + CV_Error_(Error::StsError, ("Failed to set \"%s\" window title to \"%s\"", winname.c_str(), title.c_str())); +} + double cvGetPropWindowAutoSize_W32(const char* name) { double result = -1;