Visualizzazione post con etichetta programming. Mostra tutti i post
Visualizzazione post con etichetta programming. Mostra tutti i post

domenica 28 gennaio 2018

Iterate over a vector - STL C++

just to feed your curiosity

Generate a vector, and try to iterate over it in 3 different ways:

  • using iterator STL;
  • using Range C++11;
  • using indices.


the code above includes also time points, to collect some statistics

// using iterator STL
std::cout << std::endl << "using iterator STL" << std::endl;
std::chrono::steady_clock::time_point t_time1 = std::chrono::steady_clock::now();
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
        //std::cout << *it << ", ";
*it = 1;
}
std::chrono::steady_clock::time_point t_time2 = std::chrono::steady_clock::now();

//Using Range C++11
std::cout << std::endl << "Using Range C++11" << std::endl;
std::chrono::steady_clock::time_point t_time3 = std::chrono::steady_clock::now();
for (auto & value : v) {
//std::cout << value << ", ";
value = 1;
}
std::chrono::steady_clock::time_point t_time4 = std::chrono::steady_clock::now();

//Using indices
std::cout << std::endl << "Using indices" << std::endl;
std::chrono::steady_clock::time_point t_time5 = std::chrono::steady_clock::now();
for (std::vector<int>::size_type ii = 0; ii != v.size(); ii++) {
//std::cout << v[ii] << ", ";
v[ii] = 1;
}
std::chrono::steady_clock::time_point t_time6 = std::chrono::steady_clock::now();


Change freely the size of the vector, then, if you try to understand how much time is spent to perform an assignment on the i-th element... (considering a vector with more or less 1000000 values)


Chrono outcomes
 Vector Random Content integer with size 10000030
Vector iterator STL..: 5.34919  sec.us
Range c++11..........: 2.36629  sec.us
vector indices.......: 0.518377 sec.us

sabato 4 marzo 2017

Install caffe and caffe for matlab on windows 10 for deep learning

ok, not so straightforward...

March, 2017

This brief tutorial helps you to successfully install Caffe on Windows OS and to run the MatLab wrapper on your machine.
Caffe is a very useftul deep learning framework http://caffe.berkeleyvision.org/
I used it to build a LSTM system, cutting the net to a specific layer.

1. First

Refer to this webpage, as noticed by the official webpage of the caffe project:
https://github.com/BVLC/caffe/tree/windows

2. Install pre-requisites

But, if you are a developer, or a dev-geek you have all the software into the checklist, and here you cannot find any suggestion about them:

  • Git!! 
  • Cmake, same as git, you got it previously.
  • Python, 2.X or 3.X or Anaconda, Miniconda etc. 
  • MatLab
  • Cuda and cuDnn

  • MSVC 13 or 15, ok, maybe this is not your IDE for C++, so install it!


3. Follow the instruction on the readme of the caffe windows

Care about the build_win configuration file. There you have to modify the flags with your preference about your personal installation. To install caffe on MatLab enable the correct flag.
if NOT DEFINED BUILD_MATLAB set BUILD_MATLAB=1

4. How to allow caffe working in MatLab

After the installation process (inside the MSVC build the project INSTALL of the caffe solution)
you can try to run the demo on the caffe folders, you could encounter this issue: MatLab does not recognize and accept folder name +caffe.
Copy all the DLLs and other compiled-linekd files from the build caffe folder where you have the mex caffe file.
To solve it you could make a new folder matcaffe, creating a copy of +caffe and renaming it.
When you add the folder to MatLab path using addpath link to the matcaffe folder.
However, internally MatLab use the +caffe folder. 

martedì 13 dicembre 2016

How to read a image sequence with OpenCV


This rough post contains information about the stored image sequence management for still images processing in OpenCV. This post is a reminder, not a tutorial.

Simple assumptions


  • Your image sequence contains images with file name like this: image000001.png. Normally you store images with this sequential file name convention (consider also the case of auto file naming)
  • Your images are in png format (It is only for this example)
  • Your folder absolute path is /folder1/folder2/folder3/ (please consider that Unix and Win paths are different, so use carefully the \ or / chars)


ImageList file

you can use the image list file creator inside the opencv samples, to build a xml file containing the list of the images inside the target folder.
Then you can import the list of images as a vector inside your code

VideoCapture

0. some variables
cv::Mat image_frame;
std::string str_sequenceFileName = "/folder1/folder2/folder3/image%06d.png ";

1. create a videocapture object and then open it, check if is opened and eventually send an error on the shell.

cv::VideoCapture videoCapture;
videoCapture.open(str_sequenceFileName); // open the default camera
if (!videoCapture.isOpened()) {  // check if we succeeded
std::cerr << "[EE] opening video capture OFFLINE device" << std::endl;
return -1;
}
}

2. use the videocapture object instance to grab the current frame. the videocapture grabs the frame from the image sequence folder. You can use it directly inside your main image processing loop.

videoCapture >> image_frame;

Glob

0. some variables
cv::String str_sequenceFolder = "/folder1/folder2/folder3"
cv::String glob_folder = str_sequenceFolder + "/*.png";
std::vector<cv::String> imageFileNamesList;
imageFileNamesList.clear();
cv::Mat image_frame;

1. fill the vector with the image names inside the sequence folder, to obtain the image names list vector

cv::glob(glob_folder, imageFileNamesList);

2. sort the vector (maybe it is not useful)

std::sort(imageFileNamesList.begin(), imageFileNamesList.end());

3. read the current image from the sequence folder

for (int n_frameNumber=0; n_frameNumber < imageFileNamesList.size(); ++n_frameNumber) 
{
    image_frame = cv::imread(imageFileNamesList[n_frameNumber]);
    //some image processing
}

mercoledì 8 giugno 2016

String with padded number in c++

How to use a padded number in a string in c++??

ok, I need to use it to number a image sequence.

Here the include statements
#include <iomanip> // for setfill etc
#include <string>     // for string
#include <sstream>  // for stringstream

Some variables:

std::stringstream sStream;
std::string m_frameName;
int m_frameNumber;

Finally the key piece of code

sStream << std::setfill('0') << std::setw(6) << m_frameNumber;sStream >> m_frameName;

std::cout << "=========" << std::endl << "Frame no. " << m_frameNumber <<  std::endl;
std::cout << "[DBG] " << "m_frameName: " << m_frameName << std::endl;


giovedì 13 febbraio 2014

uso dei limiti per variabili numeriche

da guardare il resto dei limiti dentro limits.h o limits, 
riferimento:
http://stackoverflow.com/questions/15889253/maximum-value-for-unsigned-int

C

#include <limits.h>
unsigned int max_unsigned_int_size = UINT_MAX;

C++

#include <limits>
unsigned int max_unsigned_int_size = std::numeric_limits<unsigned int>::max();
 
 

martedì 24 settembre 2013

da variabile a testo in c++

Per evitare che queste semplici informazioni vadano perse

per stampare il valore delle variabili numeriche dentro a una stringa:

http://stackoverflow.com/questions/5290089/how-to-convert-a-number-to-string-and-vice-versa-in-c

altrimenti ottimo articolo di cplusplus.com
http://www.cplusplus.com/articles/D9j2Nwbp/

static_cast<std::ostringstream*>( &(std::ostringstream() << it->id << "D") )->str()

venerdì 17 maggio 2013

Opencv Mat e GpuMAt

Come si passa da una all'altra, e come associarle, si non sono i termini corretti, ma non è un blog didattico, serve solo per tenere scritte alcune cose base.


cv::Mat image = cv::imread(imageName, CV_LOAD_IMAGE_COLOR);
cv::gpu::GpuMat gpu_image(image);
cv::imshow("image", image);

altro modo (http://stackoverflow.com/questions/9318388/opencv-gpumat-usage)

Mat src;
src = cv::imread("...");
GpuMat dst;
dst.upload(&src);

secondo approccio (http://stackoverflow.com/questions/6965465/how-to-convert-gpumat-to-cvmat-in-opencv)


explicit conversion: Mat -> GPUMat
Mat myMat;
GpuMat myGpuMat;
myGpuMat.upload(myMat); //Via a member function
//Or
GpuMat myGpuMat(myMat) //Via a constructor
 //Use myGpuMat here...

implicit conversion: GpuMat -> Mat
GpuMat myGpuMat;
 Mat myMat = myGpyMat; //Use myMat here...

venerdì 3 maggio 2013

Colori in OpenGL

Breve tabella di colori base in OpenGL


glColor3f(0.0, 0.0, 0.0);      /* black */
glColor3f(1.0, 0.0, 0.0);      /* red */
glColor3f(0.0, 1.0, 0.0);      /* green */
glColor3f(1.0, 1.0, 0.0);      /* yellow */
glColor3f(0.0, 0.0, 1.0);      /* blue */
glColor3f(1.0, 0.0, 1.0);      /* magenta */
glColor3f(0.0, 1.0, 1.0);      /* cyan */
glColor3f(1.0, 1.0, 1.0);      /* white */

Riferimento:
OpenGL Guide (Libro Rosso)


Black           glColor3f(0.0, 0.0, 0.0)
Red             glColor3f(1.0, 0.0, 0.0)
Green           glColor3f(0.0, 1.0, 0.0)
Yellow          glColor3f(1.0, 1.0, 0.0)
Blue            glColor3f(0.0, 0.0, 1.0)
Magenta         glColor3f(1.0, 0.0, 1.0)
Cyan            glColor3f(0.0, 1.0, 1.0)
Dark gray       glColor3f(0.25, 0.25, 0.25)
Light gray      glColor3f(0.75, 0.75, 0.75)
Brown           glColor3f(0.60, 0.40, 0.12)
Pumpkin orange  glColor3f(0.98, 0.625, 0.12)
Pastel pink     glColor3f(0.98, 0.04, 0.7)
Barney purple   glColor3f(0.60, 0.40, 0.70)
White           glColor3f(1.0, 1.0, 1.0)

Riferiemnto:
Libro Blu

giovedì 13 dicembre 2012

Windows application with console

se stai usando una windows application come entry point per l'applicazione e vuoi anche una console

#include <iostream>
#include <string>
#include <cstdio>
#include <windows.h>
#include <io.h>
#include <fcntl.h>

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
if (AllocConsole()) {
int ifd = _open_osfhandle((intptr_t)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
int ofd = _open_osfhandle((intptr_t)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);

*stdin = *_fdopen(ifd, "r");
*stdout = *_fdopen(ofd, "w");

std::cout<<"I made a console window";
std::cin.get();

fclose(stdout);
fclose(stdin);
}
}

Reference:
http://www.daniweb.com/software-development/cpp/threads/347901/is-it-possible-to-use-a-console-app-and-windows-one-at-the-same-time

venerdì 7 dicembre 2012

OpenGL su windows 7

alcuni appunti per installare OpenGL su windows 7
il mio pc è un po' datato quindi supporta fino alla 2.1

1. ricordarsi che con windows opengl sono supportate a livello driver e dovrebbero esser già nel sistema operativo, meglio comunque aggiornare i driver della propria scheda grafica.

2. per esser sicuro si può installare opengl extension viewer che testa quali opengl si possono utilizzare con i driver grafici installati.

3. preso da internet alcuni appunti sulle opengl


We need the following sets of libraries in programming OpenGL:
  1. Core OpenGL (GL): consists of hundreds of functions, which begin with a prefix "gl" (e.g., glColor, glVertex, glTranslate, glRotate). The Core OpenGL models an object via a set of geometric primitives, such as point, line, and polygon.
  2. OpenGL Utility Library (GLU): built on-top of the core OpenGL to provide important utilities and more building models (such as qradric surfaces). GLU functions start with a prefix "glu" (e.g., gluLookAt, gluPerspective)
  3. OpenGL Utilities Toolkit (GLUT): provides support to interact with the Operating System (such as creating a window, handling key and mouse inputs); and more building models (such as sphere and torus). GLUT functions start with a prefix of "glut" (e.g., glutCreatewindow, glutMouseFunc). 
  4. Quoting from the opengl.org: "GLUT is designed for constructing small to medium sized OpenGL programs. While GLUT is well-suited to learning OpenGL and developing simple OpenGL applications, GLUT is not a full-featured toolkit so large applications requiring sophisticated user interfaces are better off using native window system toolkits. GLUT is simple, easy, and small."
  5. Alternative of GLUT includes SDL, ....
  6. OpenGL Extension Wrangler Library (GLEW): "GLEW is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform." Source and pre-build binary available at http://glew.sourceforge.net/.
  7.  installazione di glut per la parte grafica.


Reference

http://www.hackorama.com/opengl/
http://www.opengl.org/resources/libraries/glut/
http://www3.ntu.edu.sg/home/ehchua/programming/opengl/HowTo_OpenGL_C.html
http://web.eecs.umich.edu/~sugih/courses/eecs487/glut-howto/

mercoledì 28 novembre 2012

OpenCV su Windows con Visual Studio

per installare opencv su windows con Visual Studio

1. installare opencv: scaricando dal sito il file eseguibile
2. installare opencv in una cartella non di sistema, così non ci sono problemi di permessi
3. aggiornare la variabile PATH del sistema, mettendo la cartella in cui sono presenti sia le dll che le lib

4. dentro a visual studio inserire nel progetto

  • indicazione della cartella degli header D:\opencv...\include
  • indicazione della cartella dei file .lib D:\opencv...\lib
  • elenco dei file lib che si usano (che sono differenti per compilazione in debug e per compilazione in release, si distinguono dalla d finale prima dell'estensione.) 
meglio dare una riavviata prima di usare il codice, per fissare la variabile path.

giovedì 22 novembre 2012

Installare ROS su Ubuntu 12.04

Come installare ROS dentro a Ubuntu precise, 12.04 LTS

Seguire le istruzioni su:
http://www.ros.org/wiki/fuerte/Installation/Ubuntu#fuerte.2BAC8-Installation.2BAC8-DebEnvironment.Environment_setup

Settare la cartella workspace, in cui lavorare, in modo che quando si esegue

roscd

si entra nella directory del workspace;

sudo vim /opt/ros/fuerte/setup.sh

qui basta inserire tra le altre cose:


ROS_WORKSPACE= ~/ROS_workspace/2012_ROS
export ROS_WORKSPACE

martedì 6 novembre 2012

Aggiungere comandi linux

Per aggiungere un nuovo comando, per lanciare ad esempio un'applicazione
In questo appunto ho fatto riferimento a Matlab, in modo da poter lanciare matlab da riga di comando come se fosse un normale comando della distribuzione Linux.

Creare lo script in bash o altro, per lanciare il programma, l'ho fatto in una cartella che uso per gli script
touch matlab.sh

Il file matlab.sh contiene questo:

#!/bin/bash
/usr/local/MATLAB/R2010b/bin/matlab -desktop

Ricordarsi di mettere i permessi di esecuzione al file
chmod +x matlab.sh


Linkare dentro alla cartella /usr/bin lo script
root@pippo:/usr/bin: ln -s /home/utente/Scripts/matlab.sh matlab

Ora si puo' lanciare matlab come un normale comando di linux.