Добавлен эффект обводки граней. Добавлена иконка в окно приложения. Исправлены некоторые неточности.

This commit is contained in:
Victor 2012-04-22 00:24:02 +03:00
parent cd99ec4268
commit 44d991e8f9
6 changed files with 32 additions and 13 deletions

View File

@ -4,12 +4,15 @@
* Применить оператор поиска граней. * Применить оператор поиска граней.
*/ */
IplImage* AbstractOperator::applyOperator(IplImage* sourceImage) { IplImage* AbstractOperator::applyOperator(IplImage* sourceImage) {
// Применение горизонтального фильтра выделения граней
IplImage* horizontalEdges = cvCloneImage(sourceImage); IplImage* horizontalEdges = cvCloneImage(sourceImage);
cvFilter2D(sourceImage, horizontalEdges, horizontalMatrix, cvPoint(-1,-1)); cvFilter2D(sourceImage, horizontalEdges, horizontalMatrix, cvPoint(-1,-1));
// Применение вертикального фильтра выделения граней
IplImage* verticalEdges = cvCloneImage(sourceImage); IplImage* verticalEdges = cvCloneImage(sourceImage);
cvFilter2D(sourceImage, verticalEdges, verticalMatrix, cvPoint(-1,-1)); cvFilter2D(sourceImage, verticalEdges, verticalMatrix, cvPoint(-1,-1));
// Объединение двух изображений в одно (G = sqrt(Gx^2 + Gy^2))
horizontalEdges = applyGradient(horizontalEdges, verticalEdges); horizontalEdges = applyGradient(horizontalEdges, verticalEdges);
cvReleaseImage(&sourceImage); cvReleaseImage(&sourceImage);
cvReleaseImage(&verticalEdges); cvReleaseImage(&verticalEdges);
@ -18,7 +21,7 @@ IplImage* AbstractOperator::applyOperator(IplImage* sourceImage) {
/** /**
* Создать матрицы свертки. * Создать матрицы свертки.
**/ */
void AbstractOperator::createMatrix() { void AbstractOperator::createMatrix() {
createHorizontalKernelMatrix(); createHorizontalKernelMatrix();
createVerticalKernelMatrix(); createVerticalKernelMatrix();

View File

@ -69,6 +69,7 @@ BEGIN
MENUITEM "&Оригинал\tCtrl+O", ID_EF_ORIGINAL MENUITEM "&Оригинал\tCtrl+O", ID_EF_ORIGINAL
MENUITEM "О&ттенки серого\tCtrl+G", ID_EF_GRAYSCALE MENUITEM "О&ттенки серого\tCtrl+G", ID_EF_GRAYSCALE
MENUITEM "&Негатив\tCtrl+I", ID_EF_INVERSE MENUITEM "&Негатив\tCtrl+I", ID_EF_INVERSE
MENUITEM "Обво&дка граней\tCtrl+D", ID_EF_STROKE
END END
POPUP "&Справка" POPUP "&Справка"
BEGIN BEGIN
@ -84,15 +85,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
"P", ID_PAUSE, VIRTKEY, CONTROL, NOINVERT "D", ID_EF_STROKE, VIRTKEY, CONTROL, NOINVERT
VK_F4, ID_EXIT, VIRTKEY, ALT, 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 VK_F9, ID_SNAPSHOT, VIRTKEY, NOINVERT
END END

View File

@ -43,8 +43,14 @@ void EdgeDetector::update() {
} else resultFrame = cvCloneImage(cameraFrame); } else resultFrame = cvCloneImage(cameraFrame);
if (!isOriginalEffect) { 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) { if (isInverseEffect) {
IplImage* tempFrame = cvCloneImage(resultFrame); IplImage* tempFrame = cvCloneImage(resultFrame);
cvNot(tempFrame, resultFrame); cvNot(tempFrame, resultFrame);
@ -79,6 +85,9 @@ void EdgeDetector::setEffects(UINT effect, bool enabled) {
case ID_EF_INVERSE: case ID_EF_INVERSE:
isInverseEffect = enabled; isInverseEffect = enabled;
break; break;
case ID_EF_STROKE:
isStrokeEffect = enabled;
break;
} }
} }

View File

@ -33,6 +33,7 @@ private:
const char* getWindowName(); const char* getWindowName();
bool isOriginalEffect, isGrayScaleEffect, isInverseEffect; bool isOriginalEffect, isGrayScaleEffect, isInverseEffect;
bool isStrokeEffect;
static int captureIndex; static int captureIndex;
AbstractOperator* edgeDetectOperator; AbstractOperator* edgeDetectOperator;
CvCapture* camera; CvCapture* camera;

View File

@ -80,6 +80,7 @@ LRESULT CALLBACK mainWindowProcedure(HWND hWnd, UINT message, UINT wParam, LONG
switch(message) { switch(message) {
case WM_CREATE: case WM_CREATE:
SetClassLong(hWnd, GCL_HICON, (LONG) LoadIcon( GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1) ));
runningThread = true; runningThread = true;
setPause(hWnd, false); setPause(hWnd, false);
setOperatorType(hWnd, ID_OP_ROBERTS); setOperatorType(hWnd, ID_OP_ROBERTS);
@ -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); ShellExecuteA(GetParent(hDlg), "open", "https://github.com/aNNiMON/DonNUEdgeDetector", NULL, NULL, SW_MAXIMIZE);
return TRUE; return TRUE;
case IDC_OK: case IDC_OK:
case IDOK:
case IDCANCEL:
EndDialog(hDlg, 0); EndDialog(hDlg, 0);
return TRUE; return TRUE;
} }
@ -131,7 +134,10 @@ void menuCommandSelected(HWND hWnd, UINT wParam) {
switch(command) { switch(command) {
case ID_SNAPSHOT: case ID_SNAPSHOT:
// Для создания скриншота необходимо приостановить обработку фреймов
setPause(hWnd, false);
detector.snapshot(); detector.snapshot();
setPause(hWnd, pause);
break; break;
case ID_PAUSE: case ID_PAUSE:

View File

@ -12,27 +12,25 @@
#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 ID_OP_SCHARR 40013 #define ID_OP_SCHARR 40013
#define OPERATORS_END 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 ID_EF_STROKE 40021
#define EFFECTS_END 40021
// 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 40039 #define _APS_NEXT_COMMAND_VALUE 40043
#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