#include <Windows.h>
#include <WinCon.h>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include "Alignment.h"
#include "mainwindow.h"
#include "globals.h"
#include <QtGui>
#include <QtCore/QCoreApplication>
#include <QApplication>
#include <QMainWindow>
#include <QHBoxLayout>
#include "conio.h"
#include <string>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sstream>
DWORD WINAPI runProg(LPVOID args);
HANDLE rThread;
HANDLE rEvent;
//Struct for passing data
struct PixelData {
int totalrpixels;
int totalgpixels;
int totalrpixelarea;
int totalgpixelarea;
cv::Point redcenter;
cv::Point greencenter;
};
cv::Point getCentroid(cv::Mat);
int runprog();
PixelData getColorSpotInfo(cv::Mat*, cv::Mat*, cv::Mat*);
int main(int argc, char *argv[])
{
MainWindow *mainwin = new MainWindow();
mainwin->show();
rEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
rThread = CreateThread(NULL,0,runProg,0,0,&runProgId);
return app.exec();
}
int runprog()
{
//Variables
cv::Mat depthimage, depthMap, bgrimage, dark, light, hsvim;
cv::Point gcoord;
cv::Point rcoord;
//Color Thresholds
int darkrmax = 230;
int darkrmin = 170;
int darkgmax = 220;
int darkgmin = 150;
int darkbmax = 200;
int darkbmin = 140;
int lightrmax = 150;
int lightrmin = 100;
int lightgmax = 80;
int lightgmin = 30;
int lightbmax = 90;
int lightbmin = 40;
//Adjust Console Location
HWND hwnds = GetConsoleWindow();
MoveWindow(hwnds,5,5,400,300,TRUE);
int rows, cols, centerx, centery;
cv::VideoCapture capture(CV_CAP_OPENNI);
capture.grab();
capture.retrieve(depthMap,CV_CAP_OPENNI_DEPTH_MAP);
capture.retrieve(bgrimage,CV_CAP_OPENNI_BGR_IMAGE);
cv::cvtColor(bgrimage,hsvim,CV_BGR2HSV);
inRange(hsvim, cv::Scalar(darkbmin, darkgmin, darkrmin), cv::Scalar(darkbmax, darkgmax, darkrmax), dark);
inRange(hsvim, cv::Scalar(lightbmin, lightgmin, lightrmin), cv::Scalar(lightbmax, lightgmax, lightrmax), light);
depthMap.convertTo(depthimage, CV_8UC1, 0.05f);
cv::cvtColor(bgrimage,hsvim,CV_BGR2HSV);
cv::imshow("CameraFeed",bgrimage);
cv::imshow("Dark",dark);
cv::imshow("Light",light);
cv::imshow("HSVFeed",hsvim);
cv::imshow("Depth",depthimage);
cvMoveWindow("CameraFeed", 5, 300);
cvMoveWindow("Dark", 800, 5);
cvMoveWindow("Light", 800, 300);
cvMoveWindow("HSVFeed", 300, 5);
cvMoveWindow("Depth", 1600, 5);
PixelData pixdatcap;
while(true){
capture.grab();
capture.retrieve(depthMap,CV_CAP_OPENNI_DEPTH_MAP);
capture.retrieve(bgrimage,CV_CAP_OPENNI_BGR_IMAGE);
depthMap.convertTo(depthimage, CV_8UC1, 0.05f);
cv::cvtColor(bgrimage,hsvim,CV_BGR2HSV);
inRange(hsvim, cv::Scalar(darkbmin, darkgmin, darkrmin), cv::Scalar(darkbmax, darkgmax, darkrmax), dark);
inRange(hsvim, cv::Scalar(lightbmin, lightgmin, lightrmin), cv::Scalar(lightbmax, lightgmax, lightrmax), light);
if(runnow == 1){
pixdatcap = getColorSpotInfo(&dark, &light, &depthMap);
runnow = 0;
}
cv::imshow("CameraFeed",bgrimage);
cv::imshow("Dark",dark);
cv::imshow("Light",light);
cv::imshow("HSVFeed",hsvim);
cv::imshow("Depth",depthimage);
cv::waitKey(1);
}
return 1;
}
cv::Point getCentroid(cv::Mat img)
{
cv::Point Coord;
cv::Moments mm = cv::moments(img,false);
double moment10 = mm.m10;
double moment01 = mm.m01;
double moment00 = mm.m00;
Coord.x = int(moment10 / moment00);
Coord.y = int(moment01 / moment00);
return Coord;
}
PixelData getColorSpotInfo(cv::Mat *greenmat, cv::Mat *redmat, cv::Mat *depthdata){
cv::Mat green = *greenmat;
cv::Mat red = *redmat;
cv::Mat depdat = *depthdata;
int totalgpix = 0;
int totalrpix = 0;
int avgdepthg = 0;
int avgdepthr= 0;
int totaldepthr = 0;
int totaldepthg = 0;
PixelData pixdat;
pixdat.redcenter = getCentroid(red);
pixdat.greencenter = getCentroid(green);
for(int x = 0; x < green.rows; x++){
for(int y = 0; y < green.cols; y++){
if(((uchar*)(green.data + green.step*x))[y] != 0){
totalgpix++;
totaldepthg += ((uchar*)(depdat.data + depdat.step*x))[y];
}
if(((uchar*)(red.data + red.step*x))[y] != 0){
totalrpix++;
totaldepthr += ((uchar*)(depdat.data + depdat.step*x))[y];
}
}
}
avgdepthr = totaldepthr/totalrpix;
avgdepthg = totaldepthg/totalgpix;
pixdat.totalgpixels = totalgpix;
pixdat.totalrpixels = totalrpix;
pixdat.totalgpixelarea = (totalgpix*avgdepthg)/100;
pixdat.totalrpixelarea = (totalrpix*avgdepthr)/100;
return pixdat;
}
DWORD WINAPI runProg(LPVOID args) {
DWORD retint;
OutputDebugStringW(L"run thread started. ");
try {
retint = runprog();
}
catch( char * str ) {
std::cout << "Exception raised: " << str << '\n';
}
OutputDebugStringW(L"run thread leaving. ");
SetEvent(rEvent);
return retint;
}