本帖最后由 ljw111 于 2019-6-1 14:54 编辑
用opencv计算Hu矩,调用cvMoments计算0到3阶矩,用cvGetSpatialMoment对三阶矩进行赋值,编译没错误,运行时出错。
C:\Users\jianwei\Desktop\cuowu1.png
完整代码:
#include "pch.h"
#include "cv.h"
#include "iostream"
#include <opencv.hpp>
#include "cv.h"
#include "highgui.h"
#include "math.h"
using namespace std;
double M[7] = { 0 };
bool HuMoment(IplImage* img)
{
double m00 = 0, m10 = 0, m01 = 0, m02 = 0, m11 = 0, m20 = 0, m03 = 0, m12 = 0, m21 = 0, m30 = 0;
double u20 = 0, u02 = 0, u11 = 0, u30 = 0, u03 = 0, u12 = 0, u21 = 0, u00 = 0, u10 = 0, u01 = 0;
double a20 = 0, a02 = 0, a11 = 0, a30 = 0, a03 = 0, a12 = 0, a21 = 0, a00 = 0, a10 = 0, a01 = 0;
double t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0;
int Center_x = 0, Center_y = 0;
CvMoments moment;
cvMoments(img, &moment, 2);
m00 = cvGetSpatialMoment(&moment, 0, 0);
m10 = cvGetSpatialMoment(&moment, 1, 0);
m01 = cvGetSpatialMoment(&moment, 0, 1);
m02 = cvGetSpatialMoment(&moment, 0, 2);
m11 = cvGetSpatialMoment(&moment, 1, 1);
m20 = cvGetSpatialMoment(&moment, 2, 0);
m03 = cvGetSpatialMoment(&moment, 0, 3);
m12 = cvGetSpatialMoment(&moment, 1, 2);
m21 = cvGetSpatialMoment(&moment, 2, 1);
m30 = cvGetSpatialMoment(&moment, 3, 0);
Center_x = (int)(m10 / m00);
Center_y = (int)(m01 / m00);
u00 = m00;
u10 = 0;
u01 = 0;
u20 = m20 - Center_x * m10;
u02 = m02 - Center_y * m01;
u11 = m11 - Center_y * m10;
u30 = m30 - 3 * Center_x*m20 + 2 * Center_x*Center_x*m10;
u03 = m03 - 3 * Center_y*m02 + 2 * Center_y*Center_y*m01;
u12 = m12 - 2 * Center_y*m11 - Center_x * m02 + 2 * Center_y*Center_y*m10;
u21 = m21 - 2 * Center_x*m11 - Center_y * m20 + 2 * Center_x*Center_x*m01;
a00 = 1;
a10 = u10 / pow(u00, 1.5);
a01 = u01 / pow(u00, 1.5);
a20 = u20 / pow(u00, 2);
a02 = u02 / pow(u00, 2);
a11 = u11 / pow(u00, 2);
a30 = u30 / pow(u00, 2.5);
a03 = u03 / pow(u00, 2.5);
a12 = u12 / pow(u00, 2.5);
a21 = u21 / pow(u00, 2.5);
t1 = (a20 - a02);
t2 = (a30 - 3 * a12);
t3 = (3 * a21 - a03);
t4 = (a30 + a12);
t5 = (a21 + a03);
M[0] = a20 + a02;
M[1] = t1 * t1 + 4 * a11*a11;
M[2] = t2 * t2 + t3 * t3;
M[3] = t4 * t4 + t5 * t5;
M[4] = t2 * t4*(t4*t4 - 3 * t5*t5) + t3 * t5*(3 * t4*t4 - t5 * t5);
M[5] = t1 * (t4*t4 - t5 * t5) + 4 * u11*t4*t5;
M[6] = t3 * t4*(t4*t4 - 3 * t5*t5) - t2 * t5*(3 * t4*t4 - t5 * t5);
return true;
}
int main(int argc, char* argv[])
{
int i;
double Sa[7] = { 0 };
IplImage*img = cvLoadImage("canny1.jpg");
HuMoment(img);
for (i = 0; i < 7; i++)
{
Sa = M;
M = 0;
}
cout << Sa[0] << endl;
cout << Sa[1] << endl;
cout << Sa[2] << endl;
cout << Sa[3] << endl;
cout << Sa[4] << endl;
cout << Sa[5] << endl;
cout << Sa[6] << endl;
cout << endl;
}
运行到cvGetSpatialMoment时出现错误0x00007FFA125785BC 处(位于 Hu3.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000006318A8E3B0 处。
|