РЕДАКТИРОВАТЬ через 3 года:
Правильная функция для этого: cv :: redu .
Уменьшает матрицу до вектора.
Функция Reduce уменьшает матрицу до вектора, обрабатывая
строки / столбцы матрицы в виде набора одномерных векторов и выполнения
указанная операция над векторами, пока одна строка / столбец не будет
получен. Например, функция может использоваться для вычисления горизонтального
и вертикальные проекции растрового изображения. В случае REDUCE_MAX и
REDUCE_MIN, выходное изображение должно иметь тот же тип, что и источник
один. В случае REDUCE_SUM и REDUCE_AVG выход может иметь
большая битовая глубина элемента для сохранения точности. И многоканальный
массивы также поддерживаются в этих двух режимах сокращения.
OLD :
Я использовал метод ROI: переместите ROI высоты изображения и ширины 1 слева направо и рассчитайте среднее значение.
Mat src = imread(filename, 0);
vector<int> graph( src.cols );
for (int c=0; c<src.cols-1; c++)
{
Mat roi = src( Rect( c,0,1,src.rows ) );
graph[c] = int(mean(roi)[0]);
}
Mat mgraph( 260, src.cols+10, CV_8UC3);
for (int c=0; c<src.cols-1; c++)
{
line( mgraph, Point(c+5,0), Point(c+5,graph[c]), Scalar(255,0,0), 1, CV_AA);
}
imshow("mgraph", mgraph);
imshow("source", src);
EDIT:
Просто из любопытства я попытался изменить размер до высоты 1, и результат был почти таким же:
Mat test;
cv::resize(src,test,Size( src.cols,1 ));
Mat mgraph1( 260, src.cols+10, CV_8UC3);
for(int c=0; c<test.cols; c++)
{
graph[c] = test.at<uchar>(0,c);
}
for (int c=0; c<src.cols-1; c++)
{
line( mgraph1, Point(c+5,0), Point(c+5,graph[c]), Scalar(255,255,0), 1, CV_AA);
}
imshow("mgraph1", mgraph1);