Добавлен эффект обводки граней. Добавлена иконка в окно приложения. Исправлены некоторые неточности.
This commit is contained in:
parent
cd99ec4268
commit
44d991e8f9
@ -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();
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user