Mat型の行列を作る時のデータ型を指定する場合は以下の定数を指定します.
CV_8U | 8ビット符号なし整数1チャンネル |
CV_8UC3 | 8ビット符号なし整数3チャンネル |
CV_64F | 64ビット浮動小数点数1チャンネル |
CV_64FC3 | 64ビット浮動小数点数3チャンネル |
at関数で指定するデータ型は以下の通りです.
unsigned char | 8ビット符号なし整数1チャンネル |
Vec3b | 8ビット符号なし整数3チャンネル |
double | 64ビット浮動小数点数1チャンネル |
Vec3d | 64ビット浮動小数点数3チャンネル |
at関数のデータ型でVec3bやVec3dを指定した場合,それは3つの要素を持つ配列になります.そこで,[0]や[1]や[2]のように添え字を指定してそれぞれの要素を表します.
以下は使用例です.
Mat gray = imread("gray.bmp", IMREAD_GRAYSCALE);
Mat grayoutput = Mat::zeros(gray.rows, gray.cols, CV_8U);
for (int y = 0; y < gray.rows; y++) {
for (int x = 0; x < gray.cols; x++) {
grayoutput.at<unsigned
char>(y, x) = gray.at<unsigned char>(y, x) / 2;
}
}
imwrite("grayoutput.bmp", grayoutput);
Mat color = imread("color.bmp", IMREAD_COLOR);
Mat coloroutput = Mat::zeros(color.rows, color.cols, CV_8UC3);
for (int y = 0; y < color.rows; y++) {
for (int x = 0; x < color.cols; x++){
coloroutput.at<Vec3b>(y,
x)[2] = color.at<Vec3b>(y, x)[2] / 2;
coloroutput.at<Vec3b>(y,
x)[1] = color.at<Vec3b>(y, x)[1] / 2;
coloroutput.at<Vec3b>(y,
x)[0] = color.at<Vec3b>(y, x)[0] / 2;
}
}
imwrite("coloroutput.bmp", coloroutput);
Mat scalar = Mat::zeros(480, 640, CV_64F);
for (int y = 0; y < scalar.rows; y++) {
for (int x = 0; x < scalar.cols; x++) {
scalar.at<double>(y,
x) = y + x;
}
}
FILE* fpscalar = fopen("scalar.raw", "wb");
for (int y = 0; y < scalar.rows; y++) {
for (int x = 0; x < scalar.cols; x++) {
float val = (float)scalar.at<double>(y,
x);
fwrite((void*)&val,
sizeof(float), 1, fpscalar);
}
}
fclose(fpscalar);
imwrite("scalar.bmp", scalar);
Mat vector = Mat::zeros(480, 640, CV_64FC3);
for (int y = 0; y < vector.rows; y++) {
for (int x = 0; x < vector.cols; x++) {
vector.at<Vec3d>(y,
x)[0] = x;
vector.at<Vec3d>(y,
x)[1] = y;
vector.at<Vec3d>(y,
x)[2] = vector.rows + vector.cols - x - y;
}
}
FILE* fpvector = fopen("vector.raw", "wb");
for (int y = 0; y < vector.rows; y++) {
for (int x = 0; x < vector.cols; x++) {
float val[3];
val[0] = (float)vector.at<Vec3d>(y,
x)[0];
val[1] = (float)vector.at<Vec3d>(y,
x)[1];
val[2] = (float)vector.at<Vec3d>(y,
x)[2];
fwrite((void*)val, sizeof(float),
3, fpvector);
}
}
fclose(fpvector);
imwrite("vector.bmp", vector);