Я преобразовал Mat в 2d массивы в c ++, используя opencv.Чтобы убедиться, что я получаю одинаковые значения пикселей в обоих контейнерах (Mat и массив), я попробовал это:
cout << xma.at<float>(4,11) << endl;
cout << xma_[4][11] << endl;
xma - это Mat, а xma_ - это 2d-массив.
Результат, который я получаю, очень далеко друг от друга!
Правильный ли способ, которым я пытаюсь получить доступ к значениям пикселей?
А вот код:
Mat imrgb = imread("src.tif", CV_LOAD_IMAGE_COLOR);
Mat bgr[3];
split(imrgb, bgr);
double average[600][800];
for(int j=0; j<=599;j++ )
{
for(int i=0; i<=799; i++)
{
average[j][i] =((((float)(bgr[0].at<uchar>(j,i)) + (float)(bgr[1].at<uchar>(j,i)) +(float)(bgr[2].at<uchar>(j,i))))/(3));
}
}
for(int j=0; j<=599;j++ )
{
for(int i=0; i<=799; i++)
{
average[j][i] = average[j][i] / 255;
}
}
src = Mat(600, 800, CV_64F, &average);
vector<float>gx;
vector<float>mult_vec;
for(int i=0; i<vec_first.size(); i++)
{
mult_vec.push_back(vec1[i] * vec2[i]);
}
for(int i=0; i<mult_vec.size(); i++)
{
gx.push_back((exp(-mult_vec[i] / C);
}
for(int i = 0; i < gx.size(); i++)
{
gy.push_back(gx[i]);
}
Mat gyMat=Mat(5, 1, CV_32F);
memcpy(gyMat.data, gy.data(), gy.size()*sizeof(float));
Mat gykernel;
cv::transpose(gy, gykernel);
filter2D(src, xma, -1 , gykernel, Point( -1, -1 ), 0, BORDER_DEFAULT );
for(j=0; j<=599;j++ )
{
for(i=0; i<=799; i++)
{
xma_[j][i] =(double)(xma.at<uchar>(j,i));
}
}
Сначала я прочитал изображение rgb, затем разделил его на 3 канала и попытался получить среднее значение для 3 каналов.Затем я разделил значения до 255, чтобы получить изображение в оттенках серого.