1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda com OpenCV

Discussão em 'Programação' iniciada por kurotenshi, 9 de Dezembro de 2008. (Respostas: 10; Visualizações: 1388)

  1. 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
     
  2. VuDu

    VuDu Power Member

    E a variável imagem foi inicializada ou só a declaraste?
    Mostra as linhas antes que usem a imagem.
     
  3. 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;
    (...)
     
  4. VuDu

    VuDu Power Member

    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ê?
     
  5. 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
     
  6. Obrigado pela ajuda VuDu, o problema no segundo programa era o tipo de imagem e já ta resolvido.

    Falta agora o problema da webcam.
     
  7. VuDu

    VuDu Power Member

    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: 13 de Dezembro de 2008
  8. Não me parece porque repara, tanto em windows como em linux os softwares para webcam funcionam na boa.
     
  9. VuDu

    VuDu Power Member

    Então sinceramente não sei... o openCV pode não suportar esses dispositivos. Já conseguiste por esse programa a funcionar em algum pc?
     
  10. 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.
     

Partilhar esta Página