void *在鼠标回调函数中转换为int ***(OpenCV C ++)

时间:2015-05-27 18:00:45

标签: c++ opencv

我正在尝试保存我在4x2矩阵中点击图像的4个点的坐标。为此,我使用以下代码。

static void mouseEvent(int evt, int x, int y, int flags, void* param)
{
    int*** p=(int***)param;


    p*=new int*[4];
    (*p)[0]=new int[2];
    (*p)[1]=new int[2];
    (*p)[2]=new int[2];
    (*p)[3]=new int[2];

    int i=0;
    if (evt == CV_EVENT_LBUTTONDOWN && i<4){
        (*p)[i][0]=x;
        (*p)[i][1]=y;
        i++;
    }
}

int main()
{
    ....

    int** p;
    namedWindow("rgb image", CV_WINDOW_AUTOSIZE);
    imshow( "rgb image", bgrImage );
    setMouseCallback("rgb image", mouseEvent, &p);

    ...
}

我在调试过程中看到的问题是行“int *** p =(int ***)param;”不管用。我检查了几个来源并认为它可能是一个64位的问题。我感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我的水晶球告诉我,你正试图获得4点的nessecary进行透视变换;)。

static void mouseEvent(int evt, int x, int y, int flags, void* param)
{
    vector<Point2f> *p = (vector<Point2f>*)param;

    if (evt == CV_EVENT_LBUTTONDOWN && p->size()<4){
        p->push_back(Point2f(x,y);
    }
}

int main()
{
    ....

    vector<Point2f> p;
    namedWindow("rgb image", CV_WINDOW_AUTOSIZE);
    imshow( "rgb image", bgrImage );
    setMouseCallback("rgb image", mouseEvent, (void*)(&p));

    ...
}

答案 1 :(得分:0)

你能试试吗?

int nth_count=0;
static void mouseEvent(int evt, int x, int y, int flags, void* param)
{
    int*** address_of_p=(int***)param;

    (*p)[nth_count]=new int[2];

    if (evt == CV_EVENT_LBUTTONDOWN && nth_count<4){
        (*p)[nth_count][0]=x;
        (*p)[nth_count][1]=y;
        nth_count++;
    }
}

int main()
{
    int** p;
    p = new int*[4];
    namedWindow("rgb image", CV_WINDOW_AUTOSIZE);
    imshow( "rgb image", bgrImage );
    setMouseCallback("rgb image", mouseEvent, &p);
}