Вторая рабочая версия приложения.
- Добавлена работа с камерой. - Добавлена возможность применять эффекты. - Имеется возможность сохранять кадры в файл. - Уменьшено в размерах окно приложения.
This commit is contained in:
parent
8d6f2fa865
commit
c3e36df40e
82
src/EdgeDetector.cpp
Normal file
82
src/EdgeDetector.cpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#include "EdgeDetector.h"
|
||||||
|
|
||||||
|
EdgeDetector::EdgeDetector() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Äåñòðóêòîð.
|
||||||
|
* Çàêðûòèå îêîí ñîçäàííûõ ïðè ïîìîùè OpenCV è îñâîáîæäåíèå ðåñóðñîâ.
|
||||||
|
*/
|
||||||
|
EdgeDetector::~EdgeDetector() {
|
||||||
|
cvReleaseCapture(&camera);
|
||||||
|
cvDestroyAllWindows();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Èíèöèàëèçàöèÿ êàìåðû, îêîí è ïåðâîíà÷àëüíûõ ïàðàìåòðîâ.
|
||||||
|
*/
|
||||||
|
void EdgeDetector::init(int deviceNumber) {
|
||||||
|
camera = initCamera(deviceNumber);
|
||||||
|
imageSize = getCameraImageSize(camera);
|
||||||
|
cvNamedWindow(getWindowName(), CV_WINDOW_AUTOSIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Îáíîâëåíèå âûâîäèìîé èíôîðìàöèè.
|
||||||
|
*/
|
||||||
|
void EdgeDetector::update() {
|
||||||
|
if (camera == NULL) return;
|
||||||
|
IplImage *tempFrame;
|
||||||
|
cameraFrame = cvQueryFrame(camera);
|
||||||
|
resultFrame = cvCloneImage(cameraFrame);
|
||||||
|
if (isGrayScaleEffect) {
|
||||||
|
resultFrame = cvCreateImage(imageSize, cameraFrame->depth, CV_LOAD_IMAGE_GRAYSCALE);
|
||||||
|
cvCvtColor(cameraFrame, resultFrame, CV_BGR2GRAY);
|
||||||
|
}
|
||||||
|
if (isInverseEffect) {
|
||||||
|
tempFrame = cvCloneImage(resultFrame);
|
||||||
|
cvNot(tempFrame, resultFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
cvShowImage(getWindowName(), resultFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ñîõðàíèòü ñêðèíøîò ðåçóëüòèðóþùåãî ôðåéìà.
|
||||||
|
*/
|
||||||
|
void EdgeDetector::snapshot() {
|
||||||
|
if (resultFrame == NULL) return;
|
||||||
|
cvSaveImage("Capture.jpg", resultFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Âûñòàâèòü ñîñòîÿíèå ýôôåêòà.
|
||||||
|
*/
|
||||||
|
void EdgeDetector::setEffects(UINT effect, bool enabled) {
|
||||||
|
switch(LOWORD(effect)) {
|
||||||
|
case ID_EF_ORIGINAL:
|
||||||
|
isOriginalEffect = enabled;
|
||||||
|
break;
|
||||||
|
case ID_EF_GRAYSCALE:
|
||||||
|
isGrayScaleEffect = enabled;
|
||||||
|
break;
|
||||||
|
case ID_EF_INVERSE:
|
||||||
|
isInverseEffect = enabled;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CvCapture* EdgeDetector::initCamera(int deviceNumber) {
|
||||||
|
//return cvCreateCameraCapture(deviceNumber);
|
||||||
|
return cvCaptureFromCAM(deviceNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
CvSize EdgeDetector::getCameraImageSize(CvCapture* camera) {
|
||||||
|
double width = cvGetCaptureProperty(camera, CV_CAP_PROP_FRAME_WIDTH);
|
||||||
|
double height = cvGetCaptureProperty(camera, CV_CAP_PROP_FRAME_HEIGHT);
|
||||||
|
return cvSize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* EdgeDetector::getWindowName() {
|
||||||
|
return "Îêíî ïðîñìîòðà";
|
||||||
|
}
|
33
src/EdgeDetector.h
Normal file
33
src/EdgeDetector.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cv.h>
|
||||||
|
#include <highgui.h>
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Êëàññ âûäåëåíèÿ ãðàíèö.
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
class EdgeDetector {
|
||||||
|
public:
|
||||||
|
EdgeDetector();
|
||||||
|
~EdgeDetector();
|
||||||
|
|
||||||
|
void init(int deviceNumber);
|
||||||
|
void update();
|
||||||
|
void snapshot();
|
||||||
|
|
||||||
|
void setEffects(UINT effect, bool enabled);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// èíèöèàëèçàöèÿ
|
||||||
|
CvCapture* initCamera(int deviceNumber);
|
||||||
|
CvSize getCameraImageSize(CvCapture* camera);
|
||||||
|
|
||||||
|
const char* getWindowName();
|
||||||
|
|
||||||
|
bool isOriginalEffect, isGrayScaleEffect, isInverseEffect;
|
||||||
|
CvCapture* camera;
|
||||||
|
CvSize imageSize;
|
||||||
|
IplImage *cameraFrame, *resultFrame;
|
||||||
|
};
|
30
src/Main.cpp
30
src/Main.cpp
@ -1,6 +1,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <commctrl.h>
|
#include <commctrl.h>
|
||||||
|
#include "EdgeDetector.h"
|
||||||
#include "WindowClass.h"
|
#include "WindowClass.h"
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
@ -15,7 +16,8 @@ void setEffectTypes(HWND hWnd);
|
|||||||
|
|
||||||
/** Ñîñòîÿíèÿ ýôôåêòîâ (âêëþ÷åí / âûêëþ÷åí) */
|
/** Ñîñòîÿíèÿ ýôôåêòîâ (âêëþ÷åí / âûêëþ÷åí) */
|
||||||
bool effectsEnabled[EFFECTS_END - EFFECTS_START + 1];
|
bool effectsEnabled[EFFECTS_END - EFFECTS_START + 1];
|
||||||
|
/** Äåòåêòîð ãðàíèö */
|
||||||
|
EdgeDetector detector;
|
||||||
|
|
||||||
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) {
|
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) {
|
||||||
// Ðåãèñòðàöèÿ êëàññà îêíà
|
// Ðåãèñòðàöèÿ êëàññà îêíà
|
||||||
@ -31,6 +33,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmd
|
|||||||
Window wnd = Window();
|
Window wnd = Window();
|
||||||
wnd.setClassName(wClass.getClassName());
|
wnd.setClassName(wClass.getClassName());
|
||||||
wnd.setInstance(hInstance);
|
wnd.setInstance(hInstance);
|
||||||
|
wnd.setBounds(CW_USEDEFAULT, CW_USEDEFAULT, 400, 300);
|
||||||
wnd.setTitle(wClass.getClassName());
|
wnd.setTitle(wClass.getClassName());
|
||||||
if (!wnd.createWindow()) return 0;
|
if (!wnd.createWindow()) return 0;
|
||||||
|
|
||||||
@ -42,8 +45,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);
|
||||||
|
|
||||||
MSG msg;
|
MSG msg;
|
||||||
while(GetMessage(&msg, NULL, 0, 0)) {
|
while(GetMessage(&msg, NULL, 0, 0)) {
|
||||||
|
detector.update();
|
||||||
if(!TranslateAccelerator(wnd.getWindow(), hAccel, &msg)) {
|
if(!TranslateAccelerator(wnd.getWindow(), hAccel, &msg)) {
|
||||||
TranslateMessage(&msg);
|
TranslateMessage(&msg);
|
||||||
DispatchMessage(&msg);
|
DispatchMessage(&msg);
|
||||||
@ -62,10 +68,7 @@ LRESULT CALLBACK mainWindowProcedure(HWND hWnd, UINT message, UINT wParam, LONG
|
|||||||
setOperatorType(hWnd, ID_OP_ROBERTS);
|
setOperatorType(hWnd, ID_OP_ROBERTS);
|
||||||
setEffectTypes(hWnd);
|
setEffectTypes(hWnd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//case WM_PAINT:
|
|
||||||
// break;
|
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
menuCommandSelected(hWnd, wParam);
|
menuCommandSelected(hWnd, wParam);
|
||||||
break;
|
break;
|
||||||
@ -87,15 +90,19 @@ void menuCommandSelected(HWND hWnd, UINT wParam) {
|
|||||||
UINT command = LOWORD(wParam);
|
UINT command = LOWORD(wParam);
|
||||||
switch(command) {
|
switch(command) {
|
||||||
|
|
||||||
|
case ID_SNAPSHOT:
|
||||||
|
detector.snapshot();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_DEVICE:
|
||||||
|
break;
|
||||||
|
|
||||||
case ID_OP_ROBERTS:
|
case ID_OP_ROBERTS:
|
||||||
case ID_OP_PREWITT:
|
case ID_OP_PREWITT:
|
||||||
case ID_OP_SOBEL:
|
case ID_OP_SOBEL:
|
||||||
setOperatorType(hWnd, command);
|
setOperatorType(hWnd, command);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_SNAPSHOT:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_EF_ORIGINAL:
|
case ID_EF_ORIGINAL:
|
||||||
case ID_EF_GRAYSCALE:
|
case ID_EF_GRAYSCALE:
|
||||||
case ID_EF_INVERSE:
|
case ID_EF_INVERSE:
|
||||||
@ -103,6 +110,9 @@ void menuCommandSelected(HWND hWnd, UINT wParam) {
|
|||||||
setEffectTypes(hWnd);
|
setEffectTypes(hWnd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ID_ABOUT:
|
||||||
|
break;
|
||||||
|
|
||||||
case ID_EXIT:
|
case ID_EXIT:
|
||||||
SendMessage(hWnd, WM_CLOSE, NULL, NULL);
|
SendMessage(hWnd, WM_CLOSE, NULL, NULL);
|
||||||
break;
|
break;
|
||||||
@ -125,7 +135,9 @@ void setOperatorType(HWND hWnd, UINT type) {
|
|||||||
void setEffectTypes(HWND hWnd) {
|
void setEffectTypes(HWND hWnd) {
|
||||||
HMENU viewMenu = GetSubMenu(GetMenu(hWnd), 1);
|
HMENU viewMenu = GetSubMenu(GetMenu(hWnd), 1);
|
||||||
for(int i = EFFECTS_START; i <= EFFECTS_END; i++) {
|
for(int i = EFFECTS_START; i <= EFFECTS_END; i++) {
|
||||||
ULONG check = effectsEnabled[EFFECTS_END - i] ? MF_CHECKED : MF_UNCHECKED;
|
int id = EFFECTS_END - i;
|
||||||
|
ULONG check = effectsEnabled[id] ? MF_CHECKED : MF_UNCHECKED;
|
||||||
CheckMenuItem( viewMenu, i, check);
|
CheckMenuItem( viewMenu, i, check);
|
||||||
|
detector.setEffects(i, effectsEnabled[id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user