Добавлен оператор Щарра. Добавлен счетчик сохранённых кадров. Исправлен баг - не отмечался пункт меню Пауза.

This commit is contained in:
Victor 2012-04-12 02:46:24 +03:00
parent 3e57fbb9d2
commit cd99ec4268
6 changed files with 60 additions and 23 deletions

View File

@ -64,6 +64,7 @@ BEGIN
MENUITEM "&Робертс\t1", ID_OP_ROBERTS MENUITEM "&Робертс\t1", ID_OP_ROBERTS
MENUITEM "&Прюитт\t2", ID_OP_PREWITT MENUITEM "&Прюитт\t2", ID_OP_PREWITT
MENUITEM "&Собель\t3", ID_OP_SOBEL MENUITEM "&Собель\t3", ID_OP_SOBEL
MENUITEM "Щарр\t4", ID_OP_SCHARR
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Оригинал\tCtrl+O", ID_EF_ORIGINAL MENUITEM "&Оригинал\tCtrl+O", ID_EF_ORIGINAL
MENUITEM "О&ттенки серого\tCtrl+G", ID_EF_GRAYSCALE MENUITEM "О&ттенки серого\tCtrl+G", ID_EF_GRAYSCALE
@ -83,15 +84,16 @@ END
IDR_MAINACCELERATOR ACCELERATORS IDR_MAINACCELERATOR ACCELERATORS
BEGIN 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 "G", ID_EF_GRAYSCALE, VIRTKEY, CONTROL, NOINVERT
"I", ID_EF_INVERSE, VIRTKEY, CONTROL, NOINVERT "I", ID_EF_INVERSE, VIRTKEY, CONTROL, NOINVERT
"O", ID_EF_ORIGINAL, 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 "P", ID_PAUSE, VIRTKEY, CONTROL, NOINVERT
VK_F4, ID_EXIT, VIRTKEY, ALT, NOINVERT
VK_F9, ID_SNAPSHOT, VIRTKEY, NOINVERT
END END

View File

@ -1,5 +1,7 @@
#include "EdgeDetector.h" #include "EdgeDetector.h"
int EdgeDetector::captureIndex = 0;
EdgeDetector::EdgeDetector() {} EdgeDetector::EdgeDetector() {}
/** /**
@ -57,7 +59,10 @@ void EdgeDetector::update() {
*/ */
void EdgeDetector::snapshot() { void EdgeDetector::snapshot() {
if (resultFrame == NULL) return; 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: case ID_OP_SOBEL:
edgeDetectOperator = new SobelOperator(); edgeDetectOperator = new SobelOperator();
break; break;
case ID_OP_SCHARR:
edgeDetectOperator = new ScharrOperator();
break;
} }
edgeDetectOperator->createMatrix(); edgeDetectOperator->createMatrix();
} }

View File

@ -6,6 +6,7 @@
#include "RobertsOperator.h" #include "RobertsOperator.h"
#include "PrewittOperator.h" #include "PrewittOperator.h"
#include "SobelOperator.h" #include "SobelOperator.h"
#include "ScharrOperator.h"
/** /**
@ -32,6 +33,7 @@ private:
const char* getWindowName(); const char* getWindowName();
bool isOriginalEffect, isGrayScaleEffect, isInverseEffect; bool isOriginalEffect, isGrayScaleEffect, isInverseEffect;
static int captureIndex;
AbstractOperator* edgeDetectOperator; AbstractOperator* edgeDetectOperator;
CvCapture* camera; CvCapture* camera;
CvSize imageSize; CvSize imageSize;

View File

@ -49,7 +49,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmd
UpdateWindow(wnd.getWindow()); UpdateWindow(wnd.getWindow());
DrawMenuBar(wnd.getWindow()); DrawMenuBar(wnd.getWindow());
detector.init(CV_CAP_ANY); // Парсинг командной строки
int deviceNumber = (lpszCmdParam == "") ? 0 : atoi(lpszCmdParam);
// Инициализация детектора граней
detector.init(deviceNumber);
MSG msg; MSG msg;
while(GetMessage(&msg, NULL, 0, 0)) { while(GetMessage(&msg, NULL, 0, 0)) {
@ -134,19 +138,6 @@ void menuCommandSelected(HWND hWnd, UINT wParam) {
setPause(hWnd, !pause); setPause(hWnd, !pause);
break; 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: case ID_ABOUT:
DialogBox(NULL, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), hWnd, (DLGPROC)AboutDialogProc); DialogBox(NULL, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), hWnd, (DLGPROC)AboutDialogProc);
break; break;
@ -154,6 +145,14 @@ void menuCommandSelected(HWND hWnd, UINT wParam) {
case ID_EXIT: case ID_EXIT:
SendMessage(hWnd, WM_CLOSE, NULL, NULL); SendMessage(hWnd, WM_CLOSE, NULL, NULL);
break; 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; pause = _pause;
HMENU cameraMenu = GetSubMenu(GetMenu(hWnd), 0); HMENU cameraMenu = GetSubMenu(GetMenu(hWnd), 0);
ULONG check = pause ? MF_CHECKED : MF_UNCHECKED; ULONG check = pause ? MF_CHECKED : MF_UNCHECKED;
CheckMenuItem(cameraMenu, 1, check); CheckMenuItem(cameraMenu, ID_PAUSE, check);
} }
/** /**

22
src/ScharrOperator.h Normal file
View File

@ -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);
}
};

View File

@ -12,23 +12,27 @@
#define ID_EXIT 40002 #define ID_EXIT 40002
#define ID_ABOUT 40003 #define ID_ABOUT 40003
#define ID_PAUSE 40004 #define ID_PAUSE 40004
#define OPERATORS_START 40010 #define OPERATORS_START 40010
#define ID_OP_ROBERTS 40010 #define ID_OP_ROBERTS 40010
#define ID_OP_PREWITT 40011 #define ID_OP_PREWITT 40011
#define ID_OP_SOBEL 40012 #define ID_OP_SOBEL 40012
#define OPERATORS_END 40012 #define ID_OP_SCHARR 40013
#define OPERATORS_END 40013
#define EFFECTS_START 40018 #define EFFECTS_START 40018
#define ID_EF_ORIGINAL 40018 #define ID_EF_ORIGINAL 40018
#define ID_EF_GRAYSCALE 40019 #define ID_EF_GRAYSCALE 40019
#define ID_EF_INVERSE 40020 #define ID_EF_INVERSE 40020
#define EFFECTS_END 40020 #define EFFECTS_END 40020
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 106 #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_CONTROL_VALUE 1003
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif