OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 2401|回复: 0

opencv关于cvMoments函数运行出错

[复制链接]
发表于 2019-6-1 14:52:17 | 显示全部楼层 |阅读模式
本帖最后由 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 处。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-20 21:53 , Processed in 0.010087 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表