может есть тут кто знающий про работу с графикой? cpp
подскажите как мне картинку растянуть (не самым обычным образом)
картинка внутри

7 Responses to может есть тут кто знающий про работу с графикой?

  1. Naion:

    собственно иксы надо по углам. и чтобы сама картинка растянулась равномерно
    можно использовать все что угодно. желательно кроссплатформенное

    размер 480x418, 20.91 kb

  2. Naion:

    planar homography. вопрос снят, можно закрывать

  3. Naion:

    если еще кому-то интересно. OpenCV & cvWarpPerspective()

    где x1,y1 = -a,-b x3,y3 = a,b

    IplImage* postRender(IplImage *src_img, float a, float b) {

    IplImage *dst_img = 0;
    CvMat *map_matrix;
    CvPoint2D32f src_pnt[4], dst_pnt[4];

    if (src_img == 0) return NULL;

    dst_img = cvCloneImage(src_img);

    dst_pnt[0] = cvPoint2D32f(0.0, 0.0);
    dst_pnt[1] = cvPoint2D32f(src_img->width-1, 0.0);
    dst_pnt[2] = cvPoint2D32f(src_img->width-1, src_img->height-1);
    dst_pnt[3] = cvPoint2D32f(0.0, src_img->height-1);

    GLdouble wX0, wY0, wZ;
    GLdouble wX1, wY1;
    GLdouble wX2, wY2;
    GLdouble wX3, wY3;

    GLint viewport[4]; // Where The Viewport Values Will Be Stored
    glGetIntegerv(GL_VIEWPORT, viewport); // Retrieves The Viewport Values (X, Y, Width, Height)
    GLdouble modelview[16]; // Where The 16 Doubles Of The Modelview Matrix Are To Be Stored
    glGetDoublev(GL_MODELVIEW_MATRIX, modelview); // Retrieve The Modelview Matrix
    GLdouble projection[16]; // Where The 16 Doubles Of The Projection Matrix Are To Be Stored
    glGetDoublev(GL_PROJECTION_MATRIX, projection); // Retrieve The Projection Matrix

    //находим координаты 3d точек на экране. 3d координаты я знаю
    gluProject(-a, -b, 0, modelview, projection, viewport, &wX0, &wY0, &wZ);
    gluProject(a, -b, 0, modelview, projection, viewport, &wX1, &wY1, &wZ);
    gluProject(a, b, 0, modelview, projection, viewport, &wX2, &wY2, &wZ);
    gluProject(-a, b, 0, modelview, projection, viewport, &wX3, &wY3, &wZ);

    src_pnt[0] = cvPoint2D32f(wX0, wY0);
    src_pnt[1] = cvPoint2D32f(wX1, wY1);
    src_pnt[2] = cvPoint2D32f(wX2, wY2);
    src_pnt[3] = cvPoint2D32f(wX3, wY3);

    map_matrix = cvCreateMat(3, 3, CV_32FC1);
    cvGetPerspectiveTransform (src_pnt, dst_pnt, map_matrix);

    cvWarpPerspective(src_img, dst_img, map_matrix); //,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(100)

    cvReleaseMat(&map_matrix);
    cvReleaseImage(&src_img);

    return dst_img;
    }

  4. N0iEkb:

    но ведь можно использовать чистый opengl. Сделать такой четырехугольник, наложить на него текстуру и тянуть. Просто, быстро и кроссплатформенно.

  5. Naion:

    у меня там за четырехугольником 3d сцена

  6. N0iEkb:

    а что меня должно смутить?

  7. Naion:

    ну у меня для начала идет рендер 3d сцены в пиксели
    IplImage* toSave = cvCreateImage(cvSize((int)section_width, (int)section_height), IPL_DEPTH_32F, 3);
    glReadPixels(0, 0, (int)section_width, (int)section_height, GL_BGR, GL_FLOAT, toSave->imageData);

    а потом уже postRender(toSave, a, b);

    если знаете способ растянуть без OpenCV, буду рад услышать 🙂

Добавить комментарий