C++
INSTALL AND CONFIGURE
OPENCV PROJECT IN
UBUNTU
Author: Nguyen Van Ca
Distributed Computing and Networking Research Laboratory
Email:
Content
I.
II.
III.
IV.
Install JVM openjdk-8-jdk
Install OpenCV
Configure project for OpenCV
Example
I. Intall open JDK 8
1. sudo add-apt-repository ppa:openjdk-r/ppa
2. sudo apt-get update
3. sudo apt-get install openjdk-8-jdk
4. sudo update-alternatives --config java
II. Install OpenCV
1. sudo apt-get upgrade
2. sudo apt-get update
3. sudo apt-get install cmake
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev
libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev
libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
4. sudo apt-get install libgtk2.0-dev
5. sudo apt-get install python-numpy
6. mkdir release
7. cd release
8. cmake -D CMAKE_BUILD_TYPE=RELEASE -D
BUILD_NEW_PYTHON_SUPPORT=ON -D
CMAKE_INSTALL_PREFIX=/usr/local ..
Or
cmake -D CMAKE_BUILD_TYPE=Release -D
CMAKE_INSTALL_PREFIX=/usr/local ..
or
cmake -D CMAKE_BUILD_TYPE=RELEASE -D
CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D
WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON
-DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" ..
9. make
10. sudo make install
III. Configure for OpenCV project
Debug Mode
1. Creat new project: Hello C++
2. Click Properties of the project
3. In C/C++ Build
a. Choise Setting: GCC C++ Complier Includes
b. GCC C++ Complier Includes
Add new Path: /usr/local/include/opencv
/usr/local/include/opencv2
Because when we make OpenCV have: -D
CMAKE_INSTALL_PREFIX=/usr/local
c. GCC C++ Linker Libraries
Add:
opencv_calib3d
opencv_contrib
opencv_core
opencv_features
opencv_flann
opencv_gpu
opencv_highgui
opencv_imgproc
opencv_legacy
opencv_ml
opencv_nonfree
opencv_objdetect
opencv_ocl
opencv_photo
opencv_stitching
opencv_superres
opencv_ts
opencv_video
opencv_videostab
Release Mode is same with Debug Mode
Build OpenCV in Command Line
1. Complier
g++ DS_OpenCV.cpp -o DS_OpenCV `pkg-config opencv --cflags --libs`
2. And then type
sudo ldconfig
3. Run OpenCV in Command Line
./DS_OpenCV
CODE
// Library of OpenCV
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/contrib/contrib.hpp>
//==============================================
// Library of C++
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <string>
#include <netdb.h>
#include <iostream>
#include <unistd.h>
#include <string.h>
//==============================================
// Library of Socket
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
using namespace cv;
using namespace std;
//==============================================
//Declare Function to process
string to_string(int i);
void receiveImage(int sock, int idimage);
void recognizeGender(Mat image, string hardKey);
void sendPOST(string harwareKey, int id_gender);
//==============================================
//Declare global variables
static int idImage = 0;
static string face_cascade_name =
"/usr/local/share/OpenCV/lbpcascades/lbpcascad
e_frontalface.xml";
static string eyes_cascade_name =
"/usr/local/share/OpenCV/haarcascades/haarcasc
ade_eye_tree_eyeglasses.xml";
//String to create POST message
static string man = "gender=man&nPersons=1&HK=";
static string woman = "gender=woman&nPersons=1&HK=";
static string crowed = "gender=crowed&nPersons=1&HK=";
static
static
static
static
string length;
string space = "\r\n\r\n";
string content, contentSend;
int lengthContent;
static const char* httpRequest1;
static const char* httpRequest2;
static const char* httpRequest3;
static string httpRequest = "POST /xibocms/listener.php HTTP/1.1\r\n"
"Host: dcn402.asuscomm.com \r\n"
"Content-Type: application/x-www-formurlencoded\r\n"
"Content-Length: ";
// Can move to Main functions
//----------------------begin-------------------------static Ptr<FaceRecognizer> model =
createLBPHFaceRecognizer();
// Load Database trained
//model->load("database_gender.xml");
//Create model to recognize Face
// Detect Face to recognize
static CascadeClassifier face_cascade;
//face_cascade.load(face_cascade_name);
static CascadeClassifier eyes_cascade;
//eyes_cascade.load(eyes_cascade_name)
//if (!face_cascade.load(face_cascade_name))
//
printf("--(!)Error loading\n");
//if (!eyes_cascade.load(eyes_cascade_name))
//
printf("--(!)Error loading\n");
//lbph_cascade.load(face_cascade_name);
// Check for invalid input
//------------------------end------------------------//==============================================
// Main Function
int main() {
// Preprocessing for recognize face
model->load("database_gender.xml");
face_cascade.load(face_cascade_name);
eyes_cascade.load(eyes_cascade_name);
//=====================
//Socket to receive Image
int sockfd, newsockfd, pid;
socklen_t clilen;
// For Local Network
int portno = 22222;
// For DCN Cloud
//int portno = 20222
struct sockaddr_in serv_addr, cli_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
perror("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
perror("ERROR on binding");
listen(sockfd, 10);
clilen = sizeof(cli_addr);
for (;;) {
idImage++;
newsockfd = accept(sockfd, (struct sockaddr *)
&cli_addr, &clilen);
if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
}
// Create child process
pid = fork();
if (pid < 0) {
perror("ERROR on fork");
exit(1);
}
if (pid == 0) {
/* This is the client process */
close(sockfd);
receiveImage(newsockfd, idImage);
exit(0);
} else {
close(newsockfd);
}
}
}
return 0;
//==============================================
void receiveImage(int newsockfd, int idimage) {
//idImage++;
cout <<
"=======================BEGIN================ " <<
endl;
// Creat variables for processing
string keyHardware;
int ptr = 0;
int bytes;
char key[255];
Mat img = Mat::zeros(480, 640, CV_8UC3);
int imgSize = img.total() * img.elemSize();
uchar sockData[imgSize];
for (int i = 0; i < imgSize; i += bytes) {
if ((bytes = recv(newsockfd, sockData + i,
imgSize - i, 0)) == -1) {
perror("ERROR on accept");
}
}
// Assign pixel value to img
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
img.at<cv::Vec3b>(i, j) =
cv::Vec3b(sockData[ptr + 0],
sockData[ptr + 1], sockData[ptr
+ 2]);
ptr = ptr + 3;
}
}
// Get Key Hardware
bytes = recv(newsockfd, key, 255, 0);
key[bytes] = '\0';
keyHardware = key;
cout << "ID Client = " << keyHardware << endl;
//For Local Network
string pidImage = to_string(idImage) + ".jpg";
cout << "Image received: " << pidImage << endl;
imwrite(pidImage, img);
// For DCN Cloud
recognizeGender(img, keyHardware);
cout << "===============END===================="
<< endl;
}
//==============================================
void recognizeGender(Mat image, string key) {
cout << "-----------Begin Recognizing------------"
<< endl;
/*
// Can move to Main functions
//-----------------------begin------------------------Ptr<FaceRecognizer> model =
createLBPHFaceRecognizer();
// Load Database trained
model->load("database_gender.xml");
//Create model to recognize Face
// Detect Face to recognize
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
if (!face_cascade.load(face_cascade_name))
printf("--(!)Error loading\n");
if (!eyes_cascade.load(eyes_cascade_name))
printf("--(!)Error loading\n");
//lbph_cascade.load(face_cascade_name);
// Check for invalid input
//------------------------end------------------------*/
if (!image.data) {
cout << "Could not open or find the image" <<
endl;
}
Mat testSample, grayImage;
cvtColor(image, grayImage, CV_BGR2GRAY);
equalizeHist(grayImage, testSample);
vector
face_cascade.detectMultiScale(testSample, faces,
1.1, 4,
CV_HAAR_DO_CANNY_PRUNING | CV_HAAR_SCALE_IMAGE,
Size(20, 20),
Size(200, 200));
if (faces.size() == 1) {
cout << "Size = 1" << endl;
// Process face by face
Rect face_i = faces[0];
Mat face = testSample(face_i);
vector<Rect> eyes;
eyes_cascade.detectMultiScale(face, eyes);
if (eyes.size() > 0) {
Mat face_resized;
resize(face, face_resized, Size(200,
200), 1.0, 1.0, INTER_CUBIC);
//rectangle(image, face_i, CV_RGB(0, 255,
0), 10);
int predictedLabel = model>predict(face_resized);
//Send POST message to DS Server
sendPOST(key, predictedLabel);
if (predictedLabel == 0)
cout << "\n Gender = MAN" << endl;
else
cout << "\n Gender = WOMAN" << endl;
} else {
cout << "DO NOT HAVE ANYONE" << endl;
cout << "DO NOT SEND MESSAGE" << endl;
}
} else if (faces.size() > 1) {
cout << "\n Size = " << faces.size() << endl;
//sendPOST(key, 2);
eyes);
Mat face_resized;
unsigned int i, n = 0;
for (i = 0; i < faces.size(); i++) {
// For the face processing
Rect face_i = faces[i];
Mat face = testSample(face_i);
// To recognize eyes
vector<Rect> eyes;
eyes_cascade.detectMultiScale(face,
if (eyes.size() > 0) {
n++;
resize(face, face_resized, Size(200,
200), 1.0, 1.0,
INTER_CUBIC);
}
}
if (n > 1) {
cout << "\n CROWDED" << endl;
sendPOST(key, 2);
}
if (n == 1) {
int predictedLabel = model>predict(face_resized);
sendPOST(key, predictedLabel);
if (predictedLabel == 0)
cout << "\n Gender = MAN instead
CROWED" << endl;
else
cout << "\n Gender = WOMAN instead
CROWED" << endl;
}
} else {
cout << "DO NOT HAVE ANYONE" << endl;
cout << "DO NOT SEND MESSAGE" << endl;
}
cout << "-----------End Recognizing------------"
<< endl;
}
//==============================================
void sendPOST(string harwareKey, int id_gender) {
//Create new socket variables
int sockfd;
int portno = 20180;
struct sockaddr_in serv_addr;
struct hostent *server;
//Create socket to send POST message
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
perror("ERROR opening socket");
server = gethostbyname("dcn402.asuscomm.com");
if (server == NULL) {
fprintf(stderr, "ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *) server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd, (struct sockaddr *)
&serv_addr, sizeof(serv_addr)) < 0)
perror("ERROR connecting");
//Send data to DS server
switch (id_gender) {
case 0:
content = man + harwareKey;
lengthContent = int(content.length());
length = to_string(lengthContent);
contentSend = httpRequest + length + space +
content;
httpRequest1 = contentSend.c_str();
send(sockfd, httpRequest1,
strlen(httpRequest1), 0);
//cout << httpRequest1 << endl;
break;
case 1:
content = woman + harwareKey;
lengthContent = int(content.length());
length = to_string(lengthContent);
contentSend = httpRequest + length + space +
content;
httpRequest2 = contentSend.c_str();
send(sockfd, httpRequest2,
strlen(httpRequest2), 0);
//cout << httpRequest2 << endl;
break;
default:
content = crowed + harwareKey;
lengthContent = int(content.length());
length = to_string(lengthContent);
contentSend = httpRequest + length + space +
content;
httpRequest3 = contentSend.c_str();
//cout << "httpRequest3" <<
strlen(httpRequest3) << endl;
send(sockfd, httpRequest3,
strlen(httpRequest3), 0);
//cout << httpRequest3 << endl;
}
}
close(sockfd);
//cout << "Connected.\n" << endl;
//-------------END-------------
//==============================================
string to_string(int i) {
std::stringstream ss;
ss << i;
return ss.str();
}