Qt3d timer and texture binding



  • I am trying to update the texture image which will be bound to the cube. Bu, when I do this I cannot see anything on the screen.

    a. Constructor has a timer which calls the update action slot every 10 ms
    b. this slot gets the cursor position and reads a Mat image
    c. Now this function calls Mat to QImage function which sets the grayscale value of the image and returns a QImage
    d. This QImage is taken and binded on the cube in the paintgl code
    e. but the code doesn't work

    @QImage Mat2QImage(cv::Mat const& src, int i, int j)
    {
    //temp.at<uchar>(i, j) = 255; //white
    cv::Mat temp, result; // make the same cv::Mat
    //cv::cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need
    cv::cvtColor(src,temp,CV_BGR2GRAY);
    for(int row=i-10; row<i+10; row++)
    {
    for(int col=j-10;col<j+10;col++)
    {
    temp.at<uchar>(i,j)=255;
    }
    }
    cv::cvtColor(temp,result,CV_GRAY2RGB);
    QImage dest((const uchar *) result.data, result.cols, result.rows, result.step, QImage::Format_RGB888);
    dest.bits(); // enforce deep copy, see documentation
    // of QImage::QImage ( const uchar * data, int width, int height, Format format )
    return dest;
    }
    //! [1] constructor, initialize the cube, cursor and camera
    CubeView::CubeView(QWidget *parent)
    {
    //! [1]
    QVector3D *cube1_pos= new QVector3D(0.0,0.0,-1.5);
    QGLBuilder builder1;
    builder1 << QGL::Faceted;
    builder1 << QGLCube(3.25);
    cube = builder1.finalizedSceneNode();
    cube->setPosition(*cube1_pos);

    QGLBuilder cursor_builder;
    cursor_builder <<QGL::Faceted;
    cursor_builder <<QGLCube(0.25);
    cursor=cursor_builder.finalizedSceneNode();
    
    //camera setup
    camera()->setFieldOfView(25);
    camera()->setNearPlane(1);
    camera()->setFarPlane(15);
    

    //! [2] set texture for cube and cursor
    //QImage image(QLatin1String(":/bluecircle.jpg"));

    cv::Mat mat=cv::imread("C:/Qt/qt-qt3d/tutorials/qt3d/cube4/bluecircle.jpg");
    
    handcursor.setImage(QImage(QLatin1String(":/hand.jpg")));
    
    
    //timer to call the update action slot
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update_action()));
    timer->start(50);
    std::cout<<i<<j<<"\n";
    

    }
    //! [2] update the cursor based on the haptic position
    void CubeView::update_action()
    {
    //QMatrix4x4 mat;
    double position[3];
    drawcursor(position);//updating the new cursor co-ordinates
    QVector3D *p2=new QVector3D(position[0],position[1],position[2]);
    cursor->setPosition(*p2);

    int i=((position[0]+(gCubeEdgeLength/2))/gCubeEdgeLength)*imageDim;
    int j=((position[1]+(gCubeEdgeLength/2))/gCubeEdgeLength)*imageDim;
    cv::imshow("image",source);
    
    //QImage image  = Mat2QImage(source, i, j);
    //image.scaled(256,256,Qt::IgnoreAspectRatio);
    //logo.setImage(image);
    update();
    

    }@


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.