Добавлен эффект обводки граней. Добавлена иконка в окно приложения. Исправлены некоторые неточности.
This commit is contained in:
parent
cd99ec4268
commit
44d991e8f9
@ -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();
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@ private:
|
||||
const char* getWindowName();
|
||||
|
||||
bool isOriginalEffect, isGrayScaleEffect, isInverseEffect;
|
||||
bool isStrokeEffect;
|
||||
static int captureIndex;
|
||||
AbstractOperator* edgeDetectOperator;
|
||||
CvCapture* camera;
|
||||
|
@ -80,6 +80,7 @@ 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);
|
||||
@ -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:
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user