Значения RGBA для 2D-массива с использованием C ++

Я встраиваю алгоритм нейронной сети в C ++ и использую изображения для обучения данных.

Мне нужно, чтобы данные были в массиве пикселей, представленных значениями x, y | rgba (массив 2d).

У меня есть ImageMagick и заголовок Magick ++. H плюс опции компилятора.

Я знаю, что библиотека заголовков работает, потому что я могу:

int col = image.columns();
int row = image.rows();
cout << "COLS: " << col << "ROWS : " << row << endl;

Мои изображения имеют размер 32×32 и результат скомпилированной программы:
root @ jarvis: ~ / Документы / Программирование / C ++ / ImageMagick # ./magick
Кол-во: 32 Строк: 32

Я просто не могу получить доступ к значениям пикселей. Я не так свободно владею C ++, как хотелось бы, но примером в PHP была бы функция, подобная этой:

Function ImageToVector($Filename){
// open an image
$im = imagecreatefrompng($Filename);
$width = imagesx($im);
$height = imagesy($im);

$i = 0;
// get a color value for each pixle in width/height matrix
for ($x = 0; $x < $width; $x++){
for($y =0; $y < $height; $y++){
$color_index = imagecolorat($im,$x,$y);
// make it human readable and store it in the inputVector array.
//each pixel is read into the array one after the other making it a single inputVector
//later, we should know the dimensions of our input images (which should all be the same size in pixels).
//so we can lay it back down layer by layer if we wish to reconstruct the image from the rgba data in our input vectors later
$inputVector[$i] =  imagecolorsforindex($im, $color_index);
$i++;
}
}
$color_tran = imagecolorsforindex($im, $color_index);
//return the input vector for entire image as an array
return ($inputVector);
}

$i=0;
$InputVector[$i] = ImageToVector("Example0.png");

Мой файл cpp это:

#include <iostream>
#include "/usr/include/ImageMagick/Magick++.h"
using namespace std;
using namespace Magick;

int main()
{
Image image("a.png");
int col = image.columns();
int row = image.rows();
PixelPacket *pixels = image.getPixels(0,0,col,row);cout << "VALUE X: " << col << "  ROWS : " << row << endl;return 0;
}

В настоящее время я работаю над тем, чтобы использовать функцию php как есть с веб-формой, используемой для хранения набора данных изображения (входных векторов) в БД. Тогда я по крайней мере смогу получить доступ к этой таблице со стороны C ++.

Я уже знаю, как это сделать. Я просто надеялся на более элегантное решение с точки зрения импорта. Спасибо всем заранее!

РЕДАКТИРОВАТЬ:

Чтобы получить доступ к данным пикселей, я пробовал такие вещи, как

#include <iostream>
#include "/usr/include/ImageMagick/Magick++.h"
using namespace std;
using namespace Magick;

int main()
{
Image image("a.png");
int w = image.columns();
int h = image.rows();
PixelPacket *pixels = image.getPixels(0, 0, w, h);

int row = 0;
int column = 0;
Color color = pixels[w * row + column];

int x = pixels[0];cout << "COLS: " << x << endl;return 0;
}

или int x = пиксели [0] [0];

с пикселями [0] [0] или пикселями [0]

root@jarvis:~/Documents/Programming/C++/ImageMagick# ./compile_main.sh
main.cpp: In function âint main()â:
main.cpp:20:17: error: cannot convert âMagickCore::PixelPacket {aka MagickCore::_PixelPacket}â to âintâ in initialization
root@jarvis:~/Documents/Programming/C++/ImageMagick# ./compile_main.sh
main.cpp: In function âint main()â:
main.cpp:20:20: error: no match for âoperator[]â in â* pixels[0]â
root@jarvis:~/Documents/Programming/C++/ImageMagick#

0

Решение

Я немного отредактировал твой код, просто чтобы прояснить

#include <iostream>
#include "/usr/include/ImageMagick/Magick++.h"
using namespace std;
using namespace Magick;

int main()
{
Image image("a.png");
int w = image.columns();
int h = image.rows();
PixelPacket *pixels = image.getPixels(0, 0, w, h);

int row = 0;
int column = 0;
Color color = pixels[0]; // get first pixel color as an example

unsigned int red = color.redQuantum;
unsigned int blue = color.blueQuantum;
unsigned int green = color.greenQuantum;
unsigned int alpha = color.alphaQuantum;cout << "RED:" << red << "BLUE:" << blue << "GREEN:" << green << "ALPHA:" << alpha << endl;return 0;
}
0

Другие решения

#include <iostream>
#include "/usr/include/ImageMagick/Magick++.h"
using namespace std;
using namespace Magick;

int main()
{
Image image("a.png");
int w = image.columns();
int h = image.rows();
PixelPacket *pixels = image.getPixels(0, 0, w, h);

int row = 0;
int column = 0;for(int i = 0; i < w*h; i++){
Color color = pixels[i]; // get first pixel color as an example

float red = color.redQuantum();
float blue = color.blueQuantum();
float green = color.greenQuantum();
float alpha = color.alphaQuantum();

//translate the bit value into standard rgba(255,255,255) values
if (red != 0){ red = red/256;}  //if the (r)gba  vector is 0, don't divide by 256
if (blue != 0){ blue = blue/256;} //if the r(g)ba  vector is 0, don't divide by 256
if (green !=0) { green = green/256;}//if the rg(b)a  vector is 0, don't divide by 256
if (alpha !=0) { alpha = alpha/256;}//if the rgb(a)  vector is 0, don't divide by 256

//output red,green,blue values
cout << "R: " << red << " G: " << green << " B :" << blue << " A:" << alpha << endl;}

return 0;
}

**edited for clearer output

пример вывода:

R: 110.43 G: 110.43 B :110.43 A:0
R: 114.445 G: 114.445 B :114.445 A:0
R: 117.457 G: 118.461 B :118.461 A:0
R: 121.473 G: 121.473 B :122.477 A:0
R: 124.484 G: 125.488 B :125.488 A:0
R: 127.496 G: 128.5 B :128.5 A:0
R: 130.508 G: 130.508 B :130.508 A:0

Конечно, мне придется округлить эти числа до целого, но спасибо за вашу помощь здесь!

0

По вопросам рекламы [email protected]