ошибки при компиляции кода для выравнивания гистограммы

Я пытаюсь реализовать собственное выравнивание гистограммы без использования библиотечной подпрограммы для выравнивания гистограммы в opencv c ++ версии 2.4.13.2.
Я скомпилировал программу в терминале следующим образом:

g++ `pkg-config --cflags opencv` histogram_Equalization.cpp `pkg-config --libs opencv` -o histeq

я получаю ошибки, как указано ниже:ошибки

Вот мой код:

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
using namespace cv;
Mat *calculateHist(Mat &M, Mat &He)
{
float P[256]={0};
int i, j, k, r;
float sum = 0.0;
float T[256]={0};
int S[256]={0};
for(i=0;i<M.rows;i++)
{
for(j=0;j<M.cols;j++)
{
int tmp = M.at<uchar>(i,j);
P[tmp] = P[tmp] +1; //[(M.at<uchar>(i,j))] + 1;
}
}
for (i=0;i<M.rows;i++)
{
for(j=0;j<M.cols;j++)
{
sum = sum + P[(M.at<uchar>(i,j))];
}
}
//int num_pixel = (M.rows)*(M.cols)
for(i=0;i<256;i++)
{
P[i] = P[i]/(sum);
}
T[0] = P[0];
for( k=1; k<256;k++)
{
T[k] = T[k-1] + P[k];
}
for( r=0; r< 256; r++)
{
S[r] = cvRound(T[r]*255);
}
for(i=0;i<M.rows;i++)
{
for(j=0;j<M.cols;j++)
{
r = M.at<uchar>(i, j);
He.at<uchar>(i,j) = S[r];
}
}
return (&He);
}
int main(int argc, char *argv[])
{

Mat image = imread(argv[1],0);
Mat He(image.size,image.type);

He = calculateHist(image, He);
imshow("original_image", image);
imshow( "histogram_equalized", He );waitKey(0);
return 0;
}

-4

Решение

size а также type являются функции класса Mat, не атрибуты, поэтому вы должны вызывать их с size()а также type(),

Как сказал ZdaR в своем комментарии, calculateHist возвращает указатель на измененное изображение. В этом нет необходимости, потому что вы He по ссылке, исходный объект модифицируется функцией.

Итак, это должно работать:

Mat He(image.size(),image.type());
calculateHist(image, He);
1

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

Я сам исправил ошибки и вот код:

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{

Mat image = imread(argv[1],0);
Mat He(image.rows, image.cols, CV_8U);
float P[256]={0};
int i, j, k, r;
float sum = 0.0;
float T[256]={0};
int S[256]={0};

/* This is to calculate the frequency of each pixel value in the range 0-255*/
for(i=0;i<image.rows;i++)
{
for(j=0;j<image.cols;j++)
{
int tmp = image.at<uchar>(i,j);
P[tmp] = P[tmp] +1; //[(M.at<uchar>(i,j))] + 1;
}
}
/*this part of the code is to find the total number of all the frequency of each pixel and then divide each freq val by this sum*/

for(j=0;j<256;j++)
{
sum = sum + P[j];
}

for(i=0;i<256;i++)
{
P[i] = P[i]/(sum);
}
/*calculation of the  cdf*/

T[0] = P[0];
for( k=1; k<256;k++)
{
T[k] = T[k-1] + P[k];
}
/*multiply it with the Level-1 here L=256*/
for( r=0; r< 256; r++)
{
S[r] = cvRound(T[r]*255);
}
/*mapping of each pixel value to the new based on the values in S array and assign it to the output image He*/
for(i=0;i<image.rows;i++)
{
for(j=0;j<image.cols;j++)
{
r = image.at<uchar>(i, j);
He.at<uchar>(i,j) = S[r];
}
}
imshow("original_image", image);
imshow( "histogram_equalized", He );waitKey(0);
return 0;
}
0

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