2015-06-27 04:41:25 +08:00
|
|
|
// highgui to XAML bridge for OpenCV
|
|
|
|
|
|
|
|
// Copyright (c) Microsoft Open Technologies, Inc.
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// (3 - clause BSD License)
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without modification, are permitted provided that
|
|
|
|
// the following conditions are met:
|
|
|
|
//
|
|
|
|
// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
|
|
|
// following disclaimer.
|
|
|
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
|
|
|
// following disclaimer in the documentation and/or other materials provided with the distribution.
|
|
|
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or
|
|
|
|
// promote products derived from this software without specific prior written permission.
|
|
|
|
//
|
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
|
|
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
|
|
// PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
|
|
|
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING
|
|
|
|
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
// POSSIBILITY OF SUCH DAMAGE.
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
#include "precomp.hpp"
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
#include <map>
|
2015-06-02 23:33:21 +08:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <assert.h>
|
2015-06-27 04:41:25 +08:00
|
|
|
#include <opencv2\highgui.hpp>
|
|
|
|
#include <opencv2\highgui\highgui_winrt.hpp>
|
|
|
|
#include <window_winrt_bridge.hpp>
|
|
|
|
|
|
|
|
#define CV_WINRT_NO_GUI_ERROR( funcname ) \
|
|
|
|
{ \
|
|
|
|
cvError( CV_StsNotImplemented, funcname, \
|
|
|
|
"The function is not implemented. ", \
|
|
|
|
__FILE__, __LINE__ ); \
|
|
|
|
}
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
#define CV_ERROR( Code, Msg ) \
|
|
|
|
{ \
|
|
|
|
cvError( (Code), cvFuncName, Msg, __FILE__, __LINE__ ); \
|
|
|
|
};
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
/********************************** WinRT Specific API Implementation ******************************************/
|
|
|
|
|
|
|
|
// Initializes or overrides container contents with default XAML markup structure
|
|
|
|
void cv::winrt_initContainer(::Windows::UI::Xaml::Controls::Panel^ _container)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
HighguiBridge::getInstance().setContainer(_container);
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
/********************************** API Implementation *********************************************************/
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvShowImage(const char* name, const CvArr* arr)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_FUNCNAME("cvShowImage");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
__BEGIN__;
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvMat stub, *image;
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (!name)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL name");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvWindow* window = HighguiBridge::getInstance().namedWindow(name);
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (!window || !arr)
|
|
|
|
return;
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_CALL(image = cvGetMat(arr, &stub));
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
//TODO: use approach from window_w32.cpp or cv::Mat(.., .., CV_8UC4)
|
|
|
|
// and cvtColor(.., .., CV_BGR2BGRA) to convert image here
|
|
|
|
// than beforehand.
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
window->updateImage(image);
|
|
|
|
HighguiBridge::getInstance().showWindow(window);
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
__END__;
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL int cvNamedWindow(const char* name, int flags)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_FUNCNAME("cvNamedWindow");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (!name)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL name");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
HighguiBridge::getInstance().namedWindow(name);
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
return CV_OK;
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvDestroyWindow(const char* name)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_FUNCNAME("cvDestroyWindow");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (!name)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL name string");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
HighguiBridge::getInstance().destroyWindow(name);
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvDestroyAllWindows()
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
HighguiBridge::getInstance().destroyAllWindows();
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL int cvCreateTrackbar2(const char* trackbar_name, const char* window_name,
|
|
|
|
int* val, int count, CvTrackbarCallback2 on_notify, void* userdata)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_FUNCNAME("cvCreateTrackbar2");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
int pos = 0;
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (!window_name || !trackbar_name)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL window or trackbar name");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (count < 0)
|
|
|
|
CV_ERROR(CV_StsOutOfRange, "Bad trackbar max value");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvWindow* window = HighguiBridge::getInstance().namedWindow(window_name);
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (!window)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL window");
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
window->createSlider(trackbar_name, val, count, on_notify, userdata);
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
return CV_OK;
|
|
|
|
}
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvSetTrackbarPos(const char* trackbar_name, const char* window_name, int pos)
|
|
|
|
{
|
|
|
|
CV_FUNCNAME("cvSetTrackbarPos");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvTrackbar* trackbar = 0;
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (trackbar_name == 0 || window_name == 0)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvWindow* window = HighguiBridge::getInstance().findWindowByName(window_name);
|
|
|
|
if (window)
|
|
|
|
trackbar = window->findTrackbarByName(trackbar_name);
|
|
|
|
|
|
|
|
if (trackbar)
|
|
|
|
trackbar->setPosition(pos);
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_FUNCNAME("cvSetTrackbarMax");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (maxval >= 0)
|
|
|
|
{
|
|
|
|
if (trackbar_name == 0 || window_name == 0)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvTrackbar* trackbar = HighguiBridge::getInstance().findTrackbarByName(trackbar_name, window_name);
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (trackbar)
|
|
|
|
trackbar->setMaxPosition(maxval);
|
|
|
|
}
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-10-19 16:44:06 +08:00
|
|
|
CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval)
|
|
|
|
{
|
|
|
|
CV_FUNCNAME("cvSetTrackbarMin");
|
|
|
|
|
|
|
|
if (minval >= 0)
|
|
|
|
{
|
|
|
|
if (trackbar_name == 0 || window_name == 0)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name");
|
|
|
|
|
|
|
|
CvTrackbar* trackbar = HighguiBridge::getInstance().findTrackbarByName(trackbar_name, window_name);
|
|
|
|
|
|
|
|
if (trackbar)
|
|
|
|
trackbar->setMinPosition(minval);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL int cvGetTrackbarPos(const char* trackbar_name, const char* window_name)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
int pos = -1;
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_FUNCNAME("cvGetTrackbarPos");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (trackbar_name == 0 || window_name == 0)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvTrackbar* trackbar = HighguiBridge::getInstance().findTrackbarByName(trackbar_name, window_name);
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (trackbar)
|
|
|
|
pos = trackbar->getPosition();
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
return pos;
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
/********************************** Not YET implemented API ****************************************************/
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL int cvWaitKey(int delay)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_WINRT_NO_GUI_ERROR("cvWaitKey");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
|
|
|
// see https://msdn.microsoft.com/en-us/library/windows/desktop/ms724411(v=vs.85).aspx
|
|
|
|
int time0 = GetTickCount64();
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
for (;;)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
|
|
|
CvWindow* window;
|
|
|
|
|
|
|
|
if (delay <= 0)
|
|
|
|
{
|
|
|
|
// TODO: implement appropriate logic here
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_WINRT_NO_GUI_ERROR("cvSetMouseCallback");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_FUNCNAME("cvSetMouseCallback");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
if (!window_name)
|
|
|
|
CV_ERROR(CV_StsNullPtr, "NULL window name");
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CvWindow* window = HighguiBridge::getInstance().findWindowByName(window_name);
|
|
|
|
if (!window)
|
|
|
|
return;
|
2015-06-02 23:33:21 +08:00
|
|
|
|
|
|
|
// TODO: implement appropriate logic here
|
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
/********************************** Disabled or not supported API **********************************************/
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvMoveWindow(const char* name, int x, int y)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_WINRT_NO_GUI_ERROR("cvMoveWindow");
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void cvResizeWindow(const char* name, int width, int height)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_WINRT_NO_GUI_ERROR("cvResizeWindow");
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL int cvInitSystem(int, char**)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_WINRT_NO_GUI_ERROR("cvInitSystem");
|
|
|
|
return CV_StsNotImplemented;
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL void* cvGetWindowHandle(const char*)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_WINRT_NO_GUI_ERROR("cvGetWindowHandle");
|
|
|
|
return (void*) CV_StsNotImplemented;
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL const char* cvGetWindowName(void*)
|
2015-06-02 23:33:21 +08:00
|
|
|
{
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_WINRT_NO_GUI_ERROR("cvGetWindowName");
|
|
|
|
return (const char*) CV_StsNotImplemented;
|
|
|
|
}
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
void cvSetModeWindow_WinRT(const char* name, double prop_value) {
|
|
|
|
CV_WINRT_NO_GUI_ERROR("cvSetModeWindow");
|
|
|
|
}
|
2015-06-02 23:33:21 +08:00
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
double cvGetModeWindow_WinRT(const char* name) {
|
|
|
|
CV_WINRT_NO_GUI_ERROR("cvGetModeWindow");
|
|
|
|
return CV_StsNotImplemented;
|
2015-06-02 23:33:21 +08:00
|
|
|
}
|
|
|
|
|
2015-06-27 04:41:25 +08:00
|
|
|
CV_IMPL int cvStartWindowThread() {
|
|
|
|
CV_WINRT_NO_GUI_ERROR("cvStartWindowThread");
|
|
|
|
return CV_StsNotImplemented;
|
|
|
|
}
|