#include"stdafx.h"
#include<iostream>
#include<fstream>
#include"GLCM.h"
#include<math.h>
#include<cmath>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
void the_GLCM::calGLCM(int* data,int scale,int GRAY_CLASS,int DISTANCE,int direction,double *index)
{
int width,height;
width=scale;
height=scale;
int *indata=https://bbs.csdn.net/topics/new int[height*width];
double *indata1=new double[height*width];
int *glcm = new int[GRAY_CLASS*GRAY_CLASS]; //灰度共生矩陣
double *glcm1=new double[GRAY_CLASS*GRAY_CLASS];//歸一化后的灰度共生矩陣
//int *imaged=new int[width*height]; //讀入資料
// //讀入灰度值并存盤于該陣列
//****************此處是進行灰度壓縮部分,具體為壓縮成GRAY_CLASS
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
double sf=(GRAY_CLASS*(data[width*i+j])/(255));
indata[i*width+j]=sf;
}
}
for(int i=0;i<GRAY_CLASS;i++) //灰度共生矩陣賦初值
{
for(int j=0;j<GRAY_CLASS;j++)
{
glcm[i*GRAY_CLASS+j]=0;
glcm1[i*GRAY_CLASS+j]=0;
}
}
int d=DISTANCE;
//開始下一步灰度共生矩陣的計算
int w,k,l;
if(direction == ANGLE_1) //建立方向為0度得共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
if(j+DISTANCE>=0&&j+DISTANCE<width) //在水平方向上向右,j+distance不超過范圍
{
k=indata[i*width+j+DISTANCE]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++; //向右
}
//if(j-DISTANCE>=0&&j-DISTANCE<width) //在水平方向上向左,j-distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
//{
// k=indata[i*width+j-DISTANCE]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++; //向左
/*}*/
}
}
}
else if(direction == ANGLE_2)//建立方向為45度得共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
if(i-DISTANCE>=0&&i-DISTANCE<height&&j+DISTANCE>=0&&j+DISTANCE<width) //在右上方向上,保證i-distance和j+distance不超過范圍
{
k=indata[(i-DISTANCE)*width+j+DISTANCE]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++;
}
//if(i+DISTANCE>=0&&i+DISTANCE<height&&j-DISTANCE>=0&&j-DISTANCE<width) //在左下方向上,保證i+distance和j-distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
//{
// k=indata[(i+DISTANCE)*width+j-DISTANCE]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++;
/*}*/
}
}
}
else if(direction == ANGLE_3)//方向為90度的共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
//if(i+DISTANCE>=0&&i+DISTANCE<height) //在向下方向上,保證i+distance不超過范圍
//{
// k=indata[(i+DISTANCE)*width+j]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++;
//}
if(i-DISTANCE>=0&&i-DISTANCE<height) //在向上方向上,保證i-distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
{
k=indata[(i-DISTANCE)*width+j]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++;
}
}
}
}
else if(direction == ANGLE_4)//方向為135度的共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
//if(j+DISTANCE>=0&&i+DISTANCE>=0&&j+DISTANCE<width&&i+DISTANCE<height) //在右下方向上,保證i+distance和j+distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
//{
// k=indata[(i+DISTANCE)*width+j+DISTANCE]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++;
//}
if(j-DISTANCE>=0&&i-DISTANCE>=0&&j-DISTANCE<width&&i-DISTANCE<height) //在左上方向上,保證i0distance和i-distance不超過范圍
{
k=indata[(i-DISTANCE)*width+j-DISTANCE]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++;
}
}
}
}
//***********************************test*************************************
double Meani,Meanj,Stdi,Stdj,Entropy,Homogeneity,Contrast,Dissimilarity,ASM,Correlation;//GLCM八個特征值
Meani=0;
Meanj=0;
double sum=0;//用于歸一化
for(int p=0;p<GRAY_CLASS;p++)
{
for(int q=0;q<GRAY_CLASS;q++)
{
sum=sum+glcm[p*GRAY_CLASS+q]; //計算出glcm內的值得總和
}
}
for( int i1=0;i1<GRAY_CLASS;i1++)
{
for(int j1=0;j1<GRAY_CLASS;j1++)
{
glcm1[i1*GRAY_CLASS+j1]=glcm[i1*GRAY_CLASS+j1]/sum; //進行歸一化計算
}
}
for(int i=0;i<GRAY_CLASS;i++)
{
for(int j=0;j<GRAY_CLASS;j++)
{
Meani+=glcm1[i*GRAY_CLASS+j]*i; //求解Mean的值
}
}
for(int i=0;i<GRAY_CLASS;i++)
{
for(int j=0;j<GRAY_CLASS;j++)
{
Meanj+=glcm1[i*GRAY_CLASS+j]*j;
}
}
double variancei=0; //方差i
double variancej=0; //方差j
Entropy=0;
Homogeneity=0;
Contrast=0;
Dissimilarity=0;
ASM=0;
Correlation=0;
for(int i2=0;i2<GRAY_CLASS;i2++)
{
for(int j2=0;j2<GRAY_CLASS;j2++)
{
variancei+=glcm1[i2*GRAY_CLASS+j2]*(i2-Meani)*(i2-Meani);
}
}
for(int i3=0;i3<GRAY_CLASS;i3++)
{
for(int j3=0;j3<GRAY_CLASS;j3++)
{
variancej+=glcm1[i3*GRAY_CLASS+j3]*(j3-Meanj)*(j3-Meanj);
}
}
for(int i1=0;i1<GRAY_CLASS;i1++) //各個GLCM特征值的計算
{
for(int j1=0;j1<GRAY_CLASS;j1++)
{
ASM+=glcm1[i1*GRAY_CLASS+j1]*glcm1[i1*GRAY_CLASS+j1];
if(glcm[i1*GRAY_CLASS+j1]!=0)
{
Entropy+=(-1*(glcm1[i1*GRAY_CLASS+j1]*log(double(glcm1[i1*GRAY_CLASS+j1]))));
}
double ssi=double(double(1)/(1+pow(double(i1-j1),2)));
double ssj=(double(1)/double(1+(i1-j1)*(i1-j1)));
Homogeneity+=glcm1[i1*GRAY_CLASS+j1]*(double(1)/double(1+abs(i1-j1))); //跟MATLAB部分定義不同,資料所給是1/(1+(i-j)^2) MATLAB則是1/(1+|i-j|)
Contrast+=glcm1[i1*GRAY_CLASS+j1]*(i1-j1)*(i1-j1);
Dissimilarity+=glcm1[i1*GRAY_CLASS+j1]*fabs(double(i1-j1));
Correlation+=((i1-Meani))*(j1-Meanj)*glcm1[i1*GRAY_CLASS+j1]/sqrt(variancei*variancej);
int p=0;
}
}
Stdi=sqrt(variancei); //求解Stdi(標準差)
Stdj=sqrt(variancej);
int i=0;
index[i++]=Meani;//Meani值
index[i++]=Meanj;//Meanj值
index[i++]=variancei;//方差i
index[i++]=variancej;//方差j
index[i++]=Stdi; //標準差i
index[i++]=Stdj; //標準差j
index[i++]=ASM;// 角二階矩
index[i++]=Homogeneity; //同質度
index[i++]=Entropy;//熵
index[i++]=Contrast;//對比度
index[i++]=Dissimilarity;//非相似性
index[i++]=Correlation;//相關性
//delete[] glcm;
//glcm=NULL;
//delete[] glcm1;
//glcm1=NULL;
delete[] indata;
indata=https://bbs.csdn.net/topics/NULL;
delete[] indata1;
indata1=NULL;
}
這個問題有時候會出現,經查詢以后說是記憶體問題,主要在new和delete上,但我并不是太熟練使用C++,找了很久也不知道哪里出問題,希望各位大神能夠幫幫忙。打斷點得話有時會在最后delete時卡住,但能力所限著實想不出問題所在,已經困擾很久。
uj5u.com熱心網友回復:
Debug 崩潰進入堆疊看是哪個陳述句引發的。你發一大段代碼我們也很難找的,而且還是沒格式化的uj5u.com熱心網友回復:
#include"stdafx.h"
#include<iostream>
#include<fstream>
#include"GLCM.h"
#include<math.h>
#include<cmath>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
void the_GLCM::calGLCM(int* data,int scale,int GRAY_CLASS,int DISTANCE,int direction,double *index)
{
int width,height;
width=scale;
height=scale;
int *indata=https://bbs.csdn.net/topics/new int[height*width];
double *indata1=new double[height*width];
int *glcm = new int[GRAY_CLASS*GRAY_CLASS]; //灰度共生矩陣
double *glcm1=new double[GRAY_CLASS*GRAY_CLASS];//歸一化后的灰度共生矩陣
//int *imaged=new int[width*height]; //讀入資料
// //讀入灰度值并存盤于該陣列
//****************此處是進行灰度壓縮部分,具體為壓縮成GRAY_CLASS
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
double sf=(GRAY_CLASS*(data[width*i+j])/(255));
indata[i*width+j]=sf;
}
}
for(int i=0;i<GRAY_CLASS;i++) //灰度共生矩陣賦初值
{
for(int j=0;j<GRAY_CLASS;j++)
{
glcm[i*GRAY_CLASS+j]=0;
glcm1[i*GRAY_CLASS+j]=0;
}
}
int d=DISTANCE;
//開始下一步灰度共生矩陣的計算
int w,k,l;
if(direction == ANGLE_1) //建立方向為0度得共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
if(j+DISTANCE>=0&&j+DISTANCE<width) //在水平方向上向右,j+distance不超過范圍
{
k=indata[i*width+j+DISTANCE]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++; //向右
}
//if(j-DISTANCE>=0&&j-DISTANCE<width) //在水平方向上向左,j-distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
//{
// k=indata[i*width+j-DISTANCE]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++; //向左
/*}*/
}
}
}
else if(direction == ANGLE_2)//建立方向為45度得共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
if(i-DISTANCE>=0&&i-DISTANCE<height&&j+DISTANCE>=0&&j+DISTANCE<width) //在右上方向上,保證i-distance和j+distance不超過范圍
{
k=indata[(i-DISTANCE)*width+j+DISTANCE]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++;
}
//if(i+DISTANCE>=0&&i+DISTANCE<height&&j-DISTANCE>=0&&j-DISTANCE<width) //在左下方向上,保證i+distance和j-distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
//{
// k=indata[(i+DISTANCE)*width+j-DISTANCE]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++;
/*}*/
}
}
}
else if(direction == ANGLE_3)//方向為90度的共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
//if(i+DISTANCE>=0&&i+DISTANCE<height) //在向下方向上,保證i+distance不超過范圍
//{
// k=indata[(i+DISTANCE)*width+j]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++;
//}
if(i-DISTANCE>=0&&i-DISTANCE<height) //在向上方向上,保證i-distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
{
k=indata[(i-DISTANCE)*width+j]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++;
}
}
}
}
else if(direction == ANGLE_4)//方向為135度的共生矩陣
{
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
l=indata[i*width+j]; //確定P(i,j)中的i元素
//if(j+DISTANCE>=0&&i+DISTANCE>=0&&j+DISTANCE<width&&i+DISTANCE<height) //在右下方向上,保證i+distance和j+distance不超過范圍 注釋原因是不考慮起始元素差異,認為i->j與j->i相同
//{
// k=indata[(i+DISTANCE)*width+j+DISTANCE]; //確定P(i,j)中的j元素
// glcm[l*GRAY_CLASS+k]++;
//}
if(j-DISTANCE>=0&&i-DISTANCE>=0&&j-DISTANCE<width&&i-DISTANCE<height) //在左上方向上,保證i0distance和i-distance不超過范圍
{
k=indata[(i-DISTANCE)*width+j-DISTANCE]; //確定P(i,j)中的j元素
glcm[l*GRAY_CLASS+k]++;
}
}
}
}
//***********************************test*************************************
double Meani,Meanj,Stdi,Stdj,Entropy,Homogeneity,Contrast,Dissimilarity,ASM,Correlation;//GLCM八個特征值
Meani=0;
Meanj=0;
double sum=0;//用于歸一化
for(int p=0;p<GRAY_CLASS;p++)
{
for(int q=0;q<GRAY_CLASS;q++)
{
sum=sum+glcm[p*GRAY_CLASS+q]; //計算出glcm內的值得總和
}
}
for( int i1=0;i1<GRAY_CLASS;i1++)
{
for(int j1=0;j1<GRAY_CLASS;j1++)
{
glcm1[i1*GRAY_CLASS+j1]=glcm[i1*GRAY_CLASS+j1]/sum; //進行歸一化計算
}
}
for(int i=0;i<GRAY_CLASS;i++)
{
for(int j=0;j<GRAY_CLASS;j++)
{
Meani+=glcm1[i*GRAY_CLASS+j]*i; //求解Mean的值
}
}
for(int i=0;i<GRAY_CLASS;i++)
{
for(int j=0;j<GRAY_CLASS;j++)
{
Meanj+=glcm1[i*GRAY_CLASS+j]*j;
}
}
double variancei=0; //方差i
double variancej=0; //方差j
Entropy=0;
Homogeneity=0;
Contrast=0;
Dissimilarity=0;
ASM=0;
Correlation=0;
for(int i2=0;i2<GRAY_CLASS;i2++)
{
for(int j2=0;j2<GRAY_CLASS;j2++)
{
variancei+=glcm1[i2*GRAY_CLASS+j2]*(i2-Meani)*(i2-Meani);
}
}
for(int i3=0;i3<GRAY_CLASS;i3++)
{
for(int j3=0;j3<GRAY_CLASS;j3++)
{
variancej+=glcm1[i3*GRAY_CLASS+j3]*(j3-Meanj)*(j3-Meanj);
}
}
for(int i1=0;i1<GRAY_CLASS;i1++) //各個GLCM特征值的計算
{
for(int j1=0;j1<GRAY_CLASS;j1++)
{
ASM+=glcm1[i1*GRAY_CLASS+j1]*glcm1[i1*GRAY_CLASS+j1];
if(glcm[i1*GRAY_CLASS+j1]!=0)
{
Entropy+=(-1*(glcm1[i1*GRAY_CLASS+j1]*log(double(glcm1[i1*GRAY_CLASS+j1]))));
}
double ssi=double(double(1)/(1+pow(double(i1-j1),2)));
double ssj=(double(1)/double(1+(i1-j1)*(i1-j1)));
Homogeneity+=glcm1[i1*GRAY_CLASS+j1]*(double(1)/double(1+abs(i1-j1))); //跟MATLAB部分定義不同,資料所給是1/(1+(i-j)^2) MATLAB則是1/(1+|i-j|)
Contrast+=glcm1[i1*GRAY_CLASS+j1]*(i1-j1)*(i1-j1);
Dissimilarity+=glcm1[i1*GRAY_CLASS+j1]*fabs(double(i1-j1));
Correlation+=((i1-Meani))*(j1-Meanj)*glcm1[i1*GRAY_CLASS+j1]/sqrt(variancei*variancej);
int p=0;
}
}
Stdi=sqrt(variancei); //求解Stdi(標準差)
Stdj=sqrt(variancej);
int i=0;
index[i++]=Meani;//Meani值
index[i++]=Meanj;//Meanj值
index[i++]=variancei;//方差i
index[i++]=variancej;//方差j
index[i++]=Stdi; //標準差i
index[i++]=Stdj; //標準差j
index[i++]=ASM;// 角二階矩
index[i++]=Homogeneity; //同質度
index[i++]=Entropy;//熵
index[i++]=Contrast;//對比度
index[i++]=Dissimilarity;//非相似性
index[i++]=Correlation;//相關性
//delete[] glcm;
//glcm=NULL;
//delete[] glcm1;
//glcm1=NULL;
delete[] indata;
indata=https://bbs.csdn.net/topics/NULL;
delete[] indata1;
indata1=NULL;
}
不太會用這個,這是出問題得那個函式 ,問題出在里面但卻搞不明白
uj5u.com熱心網友回復:
崩潰的時候在彈出的對話框按相應按鈕進入除錯,按Alt+7鍵查看Call Stack即“呼叫堆疊”里面從上到下列出的對應從里層到外層的函式呼叫歷史。雙擊某一行可將游標定位到此次呼叫的源代碼或匯編指令處,看不懂時雙擊下一行,直到能看懂為止。檢查是否資源泄漏的辦法之一:
在任務管理器 行程 查看 選擇列 里面選擇:記憶體使用、虛擬記憶體大小、句柄數、執行緒數、USER物件、GDI物件
讓你的程式(行程)不退出,回圈執行主流程很多遍,越多越好,比如1000000次甚至無限回圈,記錄以上各數值,再隔至少一小時,越長越好,比如一個月,再記錄以上各數值。如果以上兩組數值的差較大或隨時間流逝不斷增加,則鐵定有對應資源的資源泄漏!
搜“GDI泄露檢測”
uj5u.com熱心網友回復:
Debug模式下單步除錯看看,打開call stack,看看函式呼叫堆疊。另外注意的陣列下標是否存在溢位的問題。
uj5u.com熱心網友回復:
越界的可能性比較大, 除錯模式運行, 奔潰時 結合呼叫堆疊 修改解決之; 如果有多執行緒操作,建議加鎖處理轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/75390.html
標籤:界面
下一篇:求教怎么后臺向視窗發送訊息
