diff --git a/src/AbstractOperator.cpp b/src/AbstractOperator.cpp index 041301d..25f173a 100644 --- a/src/AbstractOperator.cpp +++ b/src/AbstractOperator.cpp @@ -4,12 +4,15 @@ * Применить оператор поиска граней. */ IplImage* AbstractOperator::applyOperator(IplImage* sourceImage) { + // Применение горизонтального фильтра выделения граней IplImage* horizontalEdges = cvCloneImage(sourceImage); cvFilter2D(sourceImage, horizontalEdges, horizontalMatrix, cvPoint(-1,-1)); + // Применение вертикального фильтра выделения граней IplImage* verticalEdges = cvCloneImage(sourceImage); cvFilter2D(sourceImage, verticalEdges, verticalMatrix, cvPoint(-1,-1)); + // Объединение двух изображений в одно (G = sqrt(Gx^2 + Gy^2)) horizontalEdges = applyGradient(horizontalEdges, verticalEdges); cvReleaseImage(&sourceImage); cvReleaseImage(&verticalEdges); @@ -18,7 +21,7 @@ IplImage* AbstractOperator::applyOperator(IplImage* sourceImage) { /** * Создать матрицы свертки. - **/ + */ void AbstractOperator::createMatrix() { createHorizontalKernelMatrix(); createVerticalKernelMatrix(); diff --git a/src/DonNUEdgeDetector.rc b/src/DonNUEdgeDetector.rc index 4df55f5..bb74064 100644 --- a/src/DonNUEdgeDetector.rc +++ b/src/DonNUEdgeDetector.rc @@ -69,6 +69,7 @@ BEGIN MENUITEM "&Оригинал\tCtrl+O", ID_EF_ORIGINAL MENUITEM "О&ттенки серого\tCtrl+G", ID_EF_GRAYSCALE MENUITEM "&Негатив\tCtrl+I", ID_EF_INVERSE + MENUITEM "Обво&дка граней\tCtrl+D", ID_EF_STROKE END POPUP "&Справка" BEGIN @@ -84,15 +85,16 @@ END IDR_MAINACCELERATOR ACCELERATORS BEGIN - "1", ID_OP_ROBERTS, VIRTKEY, NOINVERT - "2", ID_OP_PREWITT, VIRTKEY, NOINVERT - "3", ID_OP_SOBEL, VIRTKEY, NOINVERT - "4", ID_OP_SCHARR, VIRTKEY, NOINVERT "G", ID_EF_GRAYSCALE, VIRTKEY, CONTROL, NOINVERT "I", ID_EF_INVERSE, VIRTKEY, CONTROL, NOINVERT "O", ID_EF_ORIGINAL, VIRTKEY, CONTROL, NOINVERT - "P", ID_PAUSE, VIRTKEY, CONTROL, NOINVERT + "D", ID_EF_STROKE, VIRTKEY, CONTROL, NOINVERT VK_F4, ID_EXIT, VIRTKEY, ALT, NOINVERT + "2", ID_OP_PREWITT, VIRTKEY, NOINVERT + "1", ID_OP_ROBERTS, VIRTKEY, NOINVERT + "4", ID_OP_SCHARR, VIRTKEY, NOINVERT + "3", ID_OP_SOBEL, VIRTKEY, NOINVERT + "P", ID_PAUSE, VIRTKEY, CONTROL, NOINVERT VK_F9, ID_SNAPSHOT, VIRTKEY, NOINVERT END diff --git a/src/EdgeDetector.cpp b/src/EdgeDetector.cpp index ef20300..9680e17 100644 --- a/src/EdgeDetector.cpp +++ b/src/EdgeDetector.cpp @@ -43,8 +43,14 @@ void EdgeDetector::update() { } else resultFrame = cvCloneImage(cameraFrame); if (!isOriginalEffect) { - resultFrame = edgeDetectOperator->applyOperator(resultFrame); + if (isStrokeEffect) { + IplImage* tempFrame = cvCloneImage(resultFrame); + tempFrame = edgeDetectOperator->applyOperator(tempFrame); + cvSub(resultFrame, tempFrame, resultFrame); + cvReleaseImage(&tempFrame); + } else resultFrame = edgeDetectOperator->applyOperator(resultFrame); } + if (isInverseEffect) { IplImage* tempFrame = cvCloneImage(resultFrame); cvNot(tempFrame, resultFrame); @@ -79,6 +85,9 @@ void EdgeDetector::setEffects(UINT effect, bool enabled) { case ID_EF_INVERSE: isInverseEffect = enabled; break; + case ID_EF_STROKE: + isStrokeEffect = enabled; + break; } } diff --git a/src/EdgeDetector.h b/src/EdgeDetector.h index 807b402..aadabb5 100644 --- a/src/EdgeDetector.h +++ b/src/EdgeDetector.h @@ -33,6 +33,7 @@ private: const char* getWindowName(); bool isOriginalEffect, isGrayScaleEffect, isInverseEffect; + bool isStrokeEffect; static int captureIndex; AbstractOperator* edgeDetectOperator; CvCapture* camera; diff --git a/src/Main.cpp b/src/Main.cpp index 8949b33..e6f893c 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -80,11 +80,12 @@ LRESULT CALLBACK mainWindowProcedure(HWND hWnd, UINT message, UINT wParam, LONG switch(message) { case WM_CREATE: + SetClassLong(hWnd, GCL_HICON, (LONG) LoadIcon( GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1) )); runningThread = true; setPause(hWnd, false); setOperatorType(hWnd, ID_OP_ROBERTS); setEffectTypes(hWnd); - _beginthread(edgeDetectingThread, 0, NULL) ; + _beginthread(edgeDetectingThread, 0, NULL); break; case WM_COMMAND: @@ -114,6 +115,8 @@ BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa ShellExecuteA(GetParent(hDlg), "open", "https://github.com/aNNiMON/DonNUEdgeDetector", NULL, NULL, SW_MAXIMIZE); return TRUE; case IDC_OK: + case IDOK: + case IDCANCEL: EndDialog(hDlg, 0); return TRUE; } @@ -131,7 +134,10 @@ void menuCommandSelected(HWND hWnd, UINT wParam) { switch(command) { case ID_SNAPSHOT: + // Для создания скриншота необходимо приостановить обработку фреймов + setPause(hWnd, false); detector.snapshot(); + setPause(hWnd, pause); break; case ID_PAUSE: diff --git a/src/resource.h b/src/resource.h index f7e2adc..6b0cf49 100644 --- a/src/resource.h +++ b/src/resource.h @@ -12,27 +12,25 @@ #define ID_EXIT 40002 #define ID_ABOUT 40003 #define ID_PAUSE 40004 - #define OPERATORS_START 40010 #define ID_OP_ROBERTS 40010 #define ID_OP_PREWITT 40011 #define ID_OP_SOBEL 40012 #define ID_OP_SCHARR 40013 #define OPERATORS_END 40013 - #define EFFECTS_START 40018 #define ID_EF_ORIGINAL 40018 #define ID_EF_GRAYSCALE 40019 #define ID_EF_INVERSE 40020 -#define EFFECTS_END 40020 - +#define ID_EF_STROKE 40021 +#define EFFECTS_END 40021 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 106 -#define _APS_NEXT_COMMAND_VALUE 40039 +#define _APS_NEXT_COMMAND_VALUE 40043 #define _APS_NEXT_CONTROL_VALUE 1003 #define _APS_NEXT_SYMED_VALUE 101 #endif