Вторая рабочая версия приложения.
- Добавлена работа с камерой. - Добавлена возможность применять эффекты. - Имеется возможность сохранять кадры в файл. - Уменьшено в размерах окно приложения.
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 <stdio.h>
|
||||
#include <commctrl.h>
|
||||
#include "EdgeDetector.h"
|
||||
#include "WindowClass.h"
|
||||
#include "Window.h"
|
||||
#include "resource.h"
|
||||
@ -15,7 +16,8 @@ void setEffectTypes(HWND hWnd);
|
||||
|
||||
/** Ñîñòîÿíèÿ ýôôåêòîâ (âêëþ÷åí / âûêëþ÷åí) */
|
||||
bool effectsEnabled[EFFECTS_END - EFFECTS_START + 1];
|
||||
|
||||
/** Äåòåêòîð ãðàíèö */
|
||||
EdgeDetector detector;
|
||||
|
||||
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();
|
||||
wnd.setClassName(wClass.getClassName());
|
||||
wnd.setInstance(hInstance);
|
||||
wnd.setBounds(CW_USEDEFAULT, CW_USEDEFAULT, 400, 300);
|
||||
wnd.setTitle(wClass.getClassName());
|
||||
if (!wnd.createWindow()) return 0;
|
||||
|
||||
@ -42,8 +45,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmd
|
||||
UpdateWindow(wnd.getWindow());
|
||||
DrawMenuBar(wnd.getWindow());
|
||||
|
||||
detector.init(CV_CAP_ANY);
|
||||
|
||||
MSG msg;
|
||||
while(GetMessage(&msg, NULL, 0, 0)) {
|
||||
detector.update();
|
||||
if(!TranslateAccelerator(wnd.getWindow(), hAccel, &msg)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
@ -62,10 +68,7 @@ LRESULT CALLBACK mainWindowProcedure(HWND hWnd, UINT message, UINT wParam, LONG
|
||||
setOperatorType(hWnd, ID_OP_ROBERTS);
|
||||
setEffectTypes(hWnd);
|
||||
break;
|
||||
|
||||
//case WM_PAINT:
|
||||
// break;
|
||||
|
||||
|
||||
case WM_COMMAND:
|
||||
menuCommandSelected(hWnd, wParam);
|
||||
break;
|
||||
@ -87,15 +90,19 @@ void menuCommandSelected(HWND hWnd, UINT wParam) {
|
||||
UINT command = LOWORD(wParam);
|
||||
switch(command) {
|
||||
|
||||
case ID_SNAPSHOT:
|
||||
detector.snapshot();
|
||||
break;
|
||||
|
||||
case ID_DEVICE:
|
||||
break;
|
||||
|
||||
case ID_OP_ROBERTS:
|
||||
case ID_OP_PREWITT:
|
||||
case ID_OP_SOBEL:
|
||||
setOperatorType(hWnd, command);
|
||||
break;
|
||||
|
||||
case ID_SNAPSHOT:
|
||||
break;
|
||||
|
||||
case ID_EF_ORIGINAL:
|
||||
case ID_EF_GRAYSCALE:
|
||||
case ID_EF_INVERSE:
|
||||
@ -103,6 +110,9 @@ void menuCommandSelected(HWND hWnd, UINT wParam) {
|
||||
setEffectTypes(hWnd);
|
||||
break;
|
||||
|
||||
case ID_ABOUT:
|
||||
break;
|
||||
|
||||
case ID_EXIT:
|
||||
SendMessage(hWnd, WM_CLOSE, NULL, NULL);
|
||||
break;
|
||||
@ -125,7 +135,9 @@ void setOperatorType(HWND hWnd, UINT type) {
|
||||
void setEffectTypes(HWND hWnd) {
|
||||
HMENU viewMenu = GetSubMenu(GetMenu(hWnd), 1);
|
||||
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);
|
||||
detector.setEffects(i, effectsEnabled[id]);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user