У меня есть простой код, который рассчитывает PSNR. У меня есть два типа изображений с данными со знаком и без знака, поэтому я должен охватить оба случая в своем коде. Теперь, когда я запускаю код, я получаю правильное значение PSNR, однако я получаю следующую ошибку:
munmap_chunk (): неверный указатель
Прервано (дамп памяти)
Я знаю, что это имеет что-то с указателями. Я был бы признателен, если бы кто-то указал мне на проблему, чтобы я мог исследовать более подробно. А также, что будет лучшим решением в данном конкретном случае? Код ниже.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
#include "string.h"
#include <fstream>
int main(int argc, char *argv[])
{
int i, w, h, t, b;
double mse, d, psnr;
bool isSigned;
FILE *in_file1, *in_file2;
int *image5;
int *image6;
unsigned int *image7;
unsigned int *image8;
if(argc!=7){
printf("Usage: %s file1 file2 width height bit_resolution is_signed\n",argv[0]);
exit(1);
}
in_file1=fopen(argv[1],"rb");
in_file2=fopen(argv[2],"rb");
w=atoi(argv[3]);
h=atoi(argv[4]);
b=atoi(argv[5]);
isSigned = !strcmp(argv[6], "true");
t=w*h;
if (isSigned){
image5=(int *)calloc(t, sizeof(int));
image6=(int *)calloc(t, sizeof(int));
fread(image5,sizeof(int),w*h,in_file1);
fread(image6,sizeof(int),w*h,in_file2);
}
else{
image7=(unsigned int *)calloc(t, sizeof(unsigned int));
image8=(unsigned int *)calloc(t, sizeof(unsigned int));
fread(image7,sizeof(unsigned int),w*h,in_file1);
fread(image8,sizeof(unsigned int),w*h,in_file2);
}
mse=0.;
if(isSigned)
{
for(i=0;i<t;i++){
d=(double)image5[i]-(double)image6[i];
mse+=d*d;
}
}
else
{
for(i=0;i<t;i++){
d=(double)image7[i]-(double)image8[i];
mse+=d*d;
}
}
mse=mse/t;
d=1.;
for(i=0;i<b;i++) d*=2;
d-=1.;
psnr=20*log10(d)-10*log10(mse);
printf("P=%f MSE=%f PSNR=%fdB\n",d, mse, psnr);
free(image5);
free(image6);
free(image7);
free(image8);
return 0;
}