Ajuda com OpenCV

Boas!

Sou novo aqui e no mundo do C++ e inscrevi-me e proposito para fazer esta pergunta.
Tou a fazer uma trabalho com OpenCV e MFC, tenho dois programas pequenos feitos em Visual Studio 2005 e com compilam e correm às mil maravilhas até, por exemplo num deles, o programa crashar com um erro de acesso e nesse momento aparece uma seta a apontar para a seguinte linha de código
Código:
width=imagem->width

Onde imagem é uma IplImage de entrada no método da classe e width tá declarada como int nos atributos privados da mesma classe em que está este método.

Alguém me pode ajudar?
Se precisarem de mais código digam
 
A declaração da imagem está em

Código:
class CzernikeDlg : public CDialog
{
// Construction
public:
    CzernikeDlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
    enum { IDD = IDD_ZERNIKE_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


// Implementation
protected:
    HICON m_hIcon;
    IplImage* imagem;    // This is the image pointer (input)
    CInitVar initvar;    // The image processor as an automatic variable

(...)

Depois abre-se uma imagem e coloca-se na variável imagem mas antes tenho que a declarar de novo.

Código:
(...)

IplImage *imagem;                      // This is the image pointer
imagem=cvLoadImage(path,0);             // load the image
cvShowImage("Imagem", imagem); // display it

(...)

No .h da classe as variáveis são declaradas

Código:
class CInitVar
{
private:
double area,A00,C00,C11,S11,beta00,xbarra,ybarra;
int height,width,step;
CvMat* R11;
(...)

Finalmente atribui-se

Código:
void CInitVar::Calc(IplImage* imagem)
{
    //area
    area=0;
    height=imagem->height;
    width=imagem->width;
(...)
 
Que erro é que dá? Segmentation fault?
É muito estranho dar erro ao aceder à largura e não dar ao aceder à altura.
Já agora, estás a declarar duas variáveis do mesmo tipo com o mesmo nome em 2 sítios diferentes, porquê?
 
Sim, já reparei nisso, tem que estar no .h mas já tirei do .cpp

No outro programa resolvi o problema dizendo, nas condições de inicialização do construtor da classe, que a imagem que ele dava erro a ler era 0; resolveu td na boa mas neste não faz sentido porque a imagem já está aberta quando entra no método e nem sequer é um atributo da classe.

Corri agora tudo e deu
Código:
First-chance exception at 0x00412b19 in zernike.exe: 0xC0000005: Access violation reading location 0x0135d000.
Unhandled exception at 0x00412b19 in zernike.exe: 0xC0000005: Access violation reading location 0x0135d000.

mas agora já dá notra linha o erro.

A classe completa tem o .h

Código:
#pragma once
#include "cv.h"

class CInitVar
{
private:
    double area,A00,C00,C11,S11,beta00,xbarra,ybarra;
    int height,width,step;
    CvMat* R11;
public:
    CInitVar();
    void Calc(IplImage* imagem);
    double getXbarra();
    double getYbarra();
    double getBeta();

public:
    ~CInitVar();
};

e o .cpp


Código:
#include "StdAfx.h"
#include "InitVar.h"

#define PI 3.14159265

CInitVar::CInitVar()
{
}

void CInitVar::Calc(IplImage* imagem)
{
    //area
    area=0;
    height=imagem->height;
    width=imagem->width;
    step=imagem->widthStep/sizeof(float);
    double* data=(double*)imagem->imageData;

    for(int i=0;i<height;i++){
        for(int j=0;j<width;j++){
            area += data[i*step+j];
        };
    };

    //A00
    A00=area/PI;

    //R11
    R11=cvCreateMat(height,width,CV_32FC1);
    for(int i=0;i<height;i++){
        for(int j=0;j<width;j++){
            cvmSet(R11,i,j,(i^2+j^2)^(1/2));
        };
    };

    //C00
    C00=A00;

    //C11
    C11=0;
    for(int i=0;i<height;i++){
        for(int j=0;j<width;j++){
            C11 += (data[i*step+j]*cvmGet(R11,i,j)*((i^2+j^2)^(-1/2)))*i;
        };
    };
    C11*=(2/PI);

    //S11
    S11=0;
    for(int i=0;i<height;i++){
        for(int j=0;j<width;j++){
            S11 += (data[i*step+j]*cvmGet(R11,i,j)*((i^2+j^2)^(-1/2)))*j;
        };
    };
    S11*=(2/PI);

    //Beta00
    beta00=sqrt(PI/area);

    //xbarra, ybarra
    xbarra=C11/(2*C00);
    ybarra=S11/(2*C00);

    cvReleaseMat(&R11);
    cvReleaseImage(&imagem);
}

double CInitVar::getXbarra()
{
    return xbarra;
}
double CInitVar::getYbarra()
{
    return ybarra;
}
double CInitVar::getBeta()
{
    return beta00;
}
CInitVar::~CInitVar()
{
}

Depois de dar o erro e eu clicar "break" ele mete uma seta amarela na linha

Código:
area += data[i*step+j];

do .cpp

Obrigado pela dica de inicializar já me resolveste metade do problema
 
Isso da webcam não terá a ver com drivers?
Esse programa só pega na imagem da webcam e mostra-a... não deveria de haver problemas :s
 
Última edição:
Então sinceramente não sei... o openCV pode não suportar esses dispositivos. Já conseguiste por esse programa a funcionar em algum pc?
 
Ainda só tentei nestes dois mas segundo o meu prof de programação a coisa ta preta no que toca a suporte de video em cima do windows, axo k é mais uma das perolas do vista lol.
 
Back
Topo