I got the anonymous viewing set up, and not the steaming works like a charm. I think I get less lag than my laptop's internal camera!
Here's my current code. I am currently working on it, but it displays three windows, grayscale, and two instances of the original image, to be processed.
PHP Code:
//-----------------------------------------------------------------------------------------------------------
//face-tracking by Dev, 1.0
//Copyright 2014 Devyash Lodha
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <math.h>
#include <string>
#include <sstream>
#include <vector>
#include <WinSock.h>
using namespace std; //So I don't have to use std:: --don't worry. it's nothing big.
using namespace cv; //so I don't have to use cv:: --same here :D. Just saves time
void processDisplay( Mat processed, Mat unprocessed ); //Subroutine declaration, processDisplay
//String camIP = "xxx"; //Put your Camera MJPEG stream IP here
int capMode = 1; //capture mode: 1 for internal; 2 for AXIS M1011; 3 for AXIS M1014;
int FaceCount = 0; //variable for the nimber of faces detected
int capFailures = 0; //Failure count in camera frame fetch. CURRENTLY UNUSED
const int maxCapFailures = 10; //Max Failure count in cam frame fetch before exiting, with error code, -1. CURRENTLY UNUSED
CascadeClassifier face; //dscribes what a face looks like
CascadeClassifier eyes; //describes what eyes look like
int main( int argc, const char** argv ) { //main function
CvCapture* capture; //creates struct, "capture".*************************************************
//capture.set( capture, CV_CAP_PROP_FRAME_WIDTH, 640 ); //Sets the capture size width to 640px. Currently deactivated
//capture.set( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 ); //Sets the capture size height to 480px. Currently deactivated
//cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640); //Sets the capture size width to 640px. deactivated
//cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480); //Sets the capture size height to 480px. deactivated
CvCapture* capture2; //Creates struct, "capture2"
Mat unprocessed; //unprocessed image
Mat processed; //processed image
if( face.load( "D:\\SSDWIN7PRGFILES\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml" ) ) { //loads one face cascade
if( eyes.load( "D:\\SSDWIN7PRGFILES\\opencv\\opencv\\sources\\data\\haarcascade\\haarcascade_eye_tree_eyeglasses.xml" ) ) { //loads another face cascade
cout << "I was able to load the cascades!" << endl; //message
} else { //if not loaded second cascade
cout << "Failed to load cascades!\n\n\tOptions:\n\t[ESC] to exit\n\tAny other key to try again"; //message|error analysis
if( waitKey(0) == 27 ) { //waits and updates screen. Also detects keyboard commands
return -1; //returns error code, -1;
} else { //if no key was pressed
cout << "Trying Again" << endl; //message|info
} //close brace
} //close brace
} else { //message|error
cout << "Failed to load cascades!\n\n\tOptions:\n\t[ESC] to exit\n\tAny other key to try again"; //message|error action
if( waitKey(0) == 27 ) { //wait for [ESC] key
return -1; //exit program with error code, -1
} else { //if no [ESC] key, try to configure cascade again
cout << "Trying Again" << endl; //message|info
} //closing brace
} //closing brace
if( capMode == 1 ) { //check capture mode, descibed above at variable creation
//capture = cvCaptureFromCAM(0); //set camera of "capture" to cam 0
capture = cvCaptureFromFile("http://10.11.65.10/mjpg/video.mjpg");
//capture2 = cvCaptureFromCAM(0); //set camera of "capture2" to cam 0
//root:paradise
capture2 = cvCaptureFromFile("http://10.11.65.10/mjpg/video.mjpg");
cout << "I'm going to use the internal camera." << endl; //message|info
} else if( capMode == 2 || capMode == 3 ) { //if different cam mode
//if( camIP.empty() ) {
// cout << "IP not set" << endl;
//} else {
capture = cvCaptureFromFile("http://10.11.65.10/axis-cgi/mjpeg/video.cgi?camera=1&resolution=640x480"); //hook to network camera
capture2 = cvCaptureFromFile("http://10.11.65.10/axis-cgi/mjpeg/video.cgi?camera=1&resolution=640x480"); //hook to network camera
cout << "MJPEG stream opened" << endl; //message|info
//}
} //closing brace
if( capture ) { //check to see if capture was true
bool msgq = 0; //to prevent message from repeating
while( true ) { //infinite loop
unprocessed = cvQueryFrame( capture ); //gather image from cam
processed = cvQueryFrame( capture2 ); //gather image from cam
//unprocessed = imread("http://10.11.65.10/jpg/image.jpg?size=3");
//processed = imread("http://10.11.65.10/jpg/image.jpg?size=3");
if( !unprocessed.empty() ) { //check to see if camera is outputing footage
if( msgq = false ) { //make sure message doesn't repeat
cout << "The Webcam Stream has been opened properly!" << endl; //message|info
} //closing brace
processDisplay( processed, unprocessed ); //run the processing algorithm
msgq = true; //set flag to true
} else { //if cam frame was not present
cout << "Could not access the camera. Please maake sure nothing is already using the camera. Retrying" << endl; //message|error
} //closing brace
int c = waitKey(1); //+check to see if the [ESC] key was pressed
if( (char)c == 'c' ) { //|
break; //|
} //+closing brace
} //closing brace
} //closing brace
waitKey(0);
return 0; //closes program with safe exit code, 0!
} //closing brace
void processDisplay( Mat processed, Mat unprocessed ) { //processing algorithm
Mat gray; //New matrix for the grayscale image
Mat threshold; //New matrix for the thresholded image
cvtColor( processed, gray, CV_BGR2GRAY ); //converts color image to grayscale
equalizeHist( gray, gray ); //cleans the image
imshow( "Processed Image", processed );
imshow( "GrayScale Image (Processing)", gray );
imshow( "Original Image", unprocessed );
}
//---------------------------------------------------------------------------------------------------------------