From cd99ec4268985aba1f638a4829c1d40118f24ff1 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 12 Apr 2012 02:46:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=20?= =?UTF-8?q?=D0=A9=D0=B0=D1=80=D1=80=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=81=D1=87=D0=B5=D1=82=D1=87=D0=B8?= =?UTF-8?q?=D0=BA=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D1=91=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BA=D0=B0=D0=B4=D1=80=D0=BE=D0=B2.=20=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=20-=20=D0=BD=D0=B5=20=D0=BE=D1=82=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=D1=81=D1=8F=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=20?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=8E=20=D0=9F=D0=B0=D1=83=D0=B7=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DonNUEdgeDetector.rc | 12 +++++++----- src/EdgeDetector.cpp | 10 +++++++++- src/EdgeDetector.h | 2 ++ src/Main.cpp | 29 ++++++++++++++--------------- src/ScharrOperator.h | 22 ++++++++++++++++++++++ src/resource.h | 8 ++++++-- 6 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 src/ScharrOperator.h diff --git a/src/DonNUEdgeDetector.rc b/src/DonNUEdgeDetector.rc index 9f9b6d1..4df55f5 100644 --- a/src/DonNUEdgeDetector.rc +++ b/src/DonNUEdgeDetector.rc @@ -64,6 +64,7 @@ BEGIN MENUITEM "&Робертс\t1", ID_OP_ROBERTS MENUITEM "&Прюитт\t2", ID_OP_PREWITT MENUITEM "&Собель\t3", ID_OP_SOBEL + MENUITEM "Щарр\t4", ID_OP_SCHARR MENUITEM SEPARATOR MENUITEM "&Оригинал\tCtrl+O", ID_EF_ORIGINAL MENUITEM "О&ттенки серого\tCtrl+G", ID_EF_GRAYSCALE @@ -83,15 +84,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 - VK_F4, ID_EXIT, VIRTKEY, ALT, NOINVERT - "2", ID_OP_PREWITT, VIRTKEY, NOINVERT - "1", ID_OP_ROBERTS, VIRTKEY, NOINVERT - "3", ID_OP_SOBEL, VIRTKEY, NOINVERT - VK_F9, ID_SNAPSHOT, VIRTKEY, NOINVERT "P", ID_PAUSE, VIRTKEY, CONTROL, NOINVERT + VK_F4, ID_EXIT, VIRTKEY, ALT, NOINVERT + VK_F9, ID_SNAPSHOT, VIRTKEY, NOINVERT END diff --git a/src/EdgeDetector.cpp b/src/EdgeDetector.cpp index 8507346..ef20300 100644 --- a/src/EdgeDetector.cpp +++ b/src/EdgeDetector.cpp @@ -1,5 +1,7 @@ #include "EdgeDetector.h" +int EdgeDetector::captureIndex = 0; + EdgeDetector::EdgeDetector() {} /** @@ -57,7 +59,10 @@ void EdgeDetector::update() { */ void EdgeDetector::snapshot() { if (resultFrame == NULL) return; - cvSaveImage("Capture.jpg", resultFrame); + char filename[20]; + sprintf(filename, "Capture%d.jpg", captureIndex); + captureIndex++; + cvSaveImage(filename, resultFrame); } /** @@ -91,6 +96,9 @@ void EdgeDetector::setOperator(UINT typeOperator) { case ID_OP_SOBEL: edgeDetectOperator = new SobelOperator(); break; + case ID_OP_SCHARR: + edgeDetectOperator = new ScharrOperator(); + break; } edgeDetectOperator->createMatrix(); } diff --git a/src/EdgeDetector.h b/src/EdgeDetector.h index 3e5d9a1..807b402 100644 --- a/src/EdgeDetector.h +++ b/src/EdgeDetector.h @@ -6,6 +6,7 @@ #include "RobertsOperator.h" #include "PrewittOperator.h" #include "SobelOperator.h" +#include "ScharrOperator.h" /** @@ -32,6 +33,7 @@ private: const char* getWindowName(); bool isOriginalEffect, isGrayScaleEffect, isInverseEffect; + static int captureIndex; AbstractOperator* edgeDetectOperator; CvCapture* camera; CvSize imageSize; diff --git a/src/Main.cpp b/src/Main.cpp index 49f9833..8949b33 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -49,7 +49,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmd UpdateWindow(wnd.getWindow()); DrawMenuBar(wnd.getWindow()); - detector.init(CV_CAP_ANY); + // Парсинг командной строки + int deviceNumber = (lpszCmdParam == "") ? 0 : atoi(lpszCmdParam); + + // Инициализация детектора граней + detector.init(deviceNumber); MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { @@ -134,19 +138,6 @@ void menuCommandSelected(HWND hWnd, UINT wParam) { setPause(hWnd, !pause); break; - case ID_OP_ROBERTS: - case ID_OP_PREWITT: - case ID_OP_SOBEL: - setOperatorType(hWnd, command); - break; - - case ID_EF_ORIGINAL: - case ID_EF_GRAYSCALE: - case ID_EF_INVERSE: - effectsEnabled[EFFECTS_END - command] = !effectsEnabled[EFFECTS_END - command]; - setEffectTypes(hWnd); - break; - case ID_ABOUT: DialogBox(NULL, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), hWnd, (DLGPROC)AboutDialogProc); break; @@ -154,6 +145,14 @@ void menuCommandSelected(HWND hWnd, UINT wParam) { case ID_EXIT: SendMessage(hWnd, WM_CLOSE, NULL, NULL); break; + + default: + if ( (command >= OPERATORS_START) && (command <= OPERATORS_END) ) { + setOperatorType(hWnd, command); + } else if ( (command >= EFFECTS_START) && (command <= EFFECTS_END) ) { + effectsEnabled[EFFECTS_END - command] = !effectsEnabled[EFFECTS_END - command]; + setEffectTypes(hWnd); + } } } @@ -164,7 +163,7 @@ void setPause(HWND hWnd, bool _pause) { pause = _pause; HMENU cameraMenu = GetSubMenu(GetMenu(hWnd), 0); ULONG check = pause ? MF_CHECKED : MF_UNCHECKED; - CheckMenuItem(cameraMenu, 1, check); + CheckMenuItem(cameraMenu, ID_PAUSE, check); } /** diff --git a/src/ScharrOperator.h b/src/ScharrOperator.h new file mode 100644 index 0000000..fdfa249 --- /dev/null +++ b/src/ScharrOperator.h @@ -0,0 +1,22 @@ +#pragma once +#include "AbstractOperator.h" + +class ScharrOperator : public AbstractOperator { + +public: + void createHorizontalKernelMatrix() { + float matrix[9] = { 3, 0, -3, + 10, 0, -10, + 3, 0, -3 }; + horizontalMatrix = cvCreateMat(3, 3, CV_32FC1); + horizontalMatrix = setupKernelMatrixFromArray(horizontalMatrix, matrix); + } + + void createVerticalKernelMatrix() { + float matrix[9] = { 3, 10, 3, + 0, 0, 0, + -3,-10,-3 }; + verticalMatrix = cvCreateMat(3, 3, CV_32FC1); + verticalMatrix = setupKernelMatrixFromArray(verticalMatrix, matrix); + } +}; \ No newline at end of file diff --git a/src/resource.h b/src/resource.h index ee18b5c..f7e2adc 100644 --- a/src/resource.h +++ b/src/resource.h @@ -12,23 +12,27 @@ #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 OPERATORS_END 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 + // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 106 -#define _APS_NEXT_COMMAND_VALUE 40035 +#define _APS_NEXT_COMMAND_VALUE 40039 #define _APS_NEXT_CONTROL_VALUE 1003 #define _APS_NEXT_SYMED_VALUE 101 #endif