Matlab C: differenze tra le versioni
Da Bioingegneria Elettronica e Informatica.
(Creata pagina con "'''Irio De Feudis''' [mailto:irio.defeudis@poliba.it irio.defeudis@poliba.it] '''Vitoantonio Bevilacqua''' [mailto:vitoantonio.bevilacqua@poliba.it vitoantonio.bevilacqua@pol...") |
(→Input Image) |
||
(Una versione intermedia di uno stesso utente non sono mostrate ) | |||
Riga 2: | Riga 2: | ||
'''Vitoantonio Bevilacqua''' [mailto:vitoantonio.bevilacqua@poliba.it vitoantonio.bevilacqua@poliba.it] | '''Vitoantonio Bevilacqua''' [mailto:vitoantonio.bevilacqua@poliba.it vitoantonio.bevilacqua@poliba.it] | ||
− | |||
− | |||
== MATLAB C/C++ interface in Visual Studio == | == MATLAB C/C++ interface in Visual Studio == | ||
=== Input Image === | === Input Image === | ||
− | + | [http://www.vitoantoniobevilacqua.it/wiki/images/thumb/b/b2/Heatmap.jpg/1200px-Heatmap.jpg Input Image] | |
+ | |||
=== Code === | === Code === | ||
<syntaxhighlight lang="c" line> | <syntaxhighlight lang="c" line> |
Versione attuale delle 13:18, 19 dic 2019
Irio De Feudis irio.defeudis@poliba.it
Vitoantonio Bevilacqua vitoantonio.bevilacqua@poliba.it
MATLAB C/C++ interface in Visual Studio
Input Image
Code
#include "engine.h"
#include <iostream>
using namespace std;
unsigned char** getRawGrayScaleImage(mxArray *);
void putRawGrayScaleImageInMatlab(unsigned char ** mat, int n);
void countAboveBelowThreshold(unsigned char ** mat, int n, int th);
void invertImage(unsigned char ** mat, int n);
//declare pointer to engine
Engine *eng;
int main() {
//initialize it with the handle to a new session of MATLAB engine
eng = engOpen(NULL);
engSetVisible(eng, 0);
//check status
if (!(eng)) {
exit(-1);
}
//open image in MATLAB engine (using image path)
engEvalString(eng, "I = imread('C:\\Users\\Irio\\Desktop\\\Esercizio_05122019\\MATLAB&VISUAL STUDIO\\codes\\Heatmap.jpg');");
//show image I
engEvalString(eng, "imshow(I)");
//wait engine
system("PAUSE");
//....manage your matrix in MATLAB (crop and convert)
// MATLAB functions:
// imcrop - creates a crop of the image
engEvalString(eng, "I = imcrop(I,[276,279,844,844]);");
engEvalString(eng, "imshow(I)");
system("PAUSE");
// rgb2gray - convert RGB image or colormap to grayscale.
engEvalString(eng, "I = rgb2gray(I);");
engEvalString(eng, "imshow(I)");
system("PAUSE");
//get mxArray of the image (C++ style)
mxArray *imageML = engGetVariable(eng, "I");
unsigned char **rawimage = getRawGrayScaleImage(imageML);
//....manage your matrix in C++
// count and print elements above and below a threshold value
countAboveBelowThreshold(rawimage, 845, 127);
system("pause");
// invert image
invertImage(rawimage, 845);
system("pause");
//put image back in MATLAB
putRawGrayScaleImageInMatlab(rawimage, 845);
//show image
engEvalString(eng, "imshow(I)");
system("pause");
//close the session
engClose(eng);
return 0;
}
//extract image from mxArray pointer
unsigned char** getRawGrayScaleImage(mxArray *imagePtr) {
int n = (int)mxGetN(imagePtr);
unsigned char **mat = new unsigned char*[n];
for (int i = 0; i < n; i++)
mat[i] = new unsigned char[n];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
mat[i][j] = *((unsigned char*)mxGetData(imagePtr) + i + j*n);
}
return mat;
}
//create mxArray from image
void putRawGrayScaleImageInMatlab(unsigned char ** mat, int n) {
mxArray *matrix = mxCreateNumericMatrix(n, n, mxUINT8_CLASS, mxREAL);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
unsigned char *data = (unsigned char*)mxGetData(matrix) + i + j*n;
*data = mat[i][j];
}
engPutVariable(eng, "I", matrix);
}
// count elements over and under threshold
void countAboveBelowThreshold(unsigned char ** mat, int n, int th) {
int above = 0;
int below = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if (mat[i][j] <= th)
below++;
else
above++;
}
cout << "Threshold: " << th << endl;
cout << "Elements above the threshold: " << above << endl;
cout << "Elements below the threshold: "<< below << endl;
}
// invert image
void invertImage(unsigned char ** mat, int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
mat[i][j] = 255 - mat[i][j];
}
}