在头文件中无效使用非静态成员函数

埃米拉兹

我是C / C ++的新手,存在以下问题。作为可执行文件的一部分,我想使用OpenCV在图片上绘制一些矩形。为此,我定义了一个单独的头文件,以使.cpp可执行文件尽可能短。看起来像这样:

typedef struct Rectangle {
    cv::Point startPoint;
    cv::Point endPoint;

};

class drawSpaces {

private:
    Mat img;
    int ix = 1;
    int iy = 1;
    std::list<Rectangle> rectList;

public:
//mouse callback function
    void drawRect(int event, int x, int y, int, void *param) {
        if (event == CV_EVENT_LBUTTONDOWN) {
           //Save first point of rect
            ix = x;
            iy = y;
        } else if (event == CV_EVENT_LBUTTONUP) {
            //Save 2nd point of rect
            cv::rectangle(img, Point(ix, iy), Point(x, y), cv::Scalar(0, 255, 0));
            Rectangle rect;
            rect.startPoint = Point(ix, iy);
            rect.endPoint = Point(x, y);
            rectList.push_back(rect);
            }
        }
    }


    int draw(Mat image) {
        img = image;
        if (img.empty()) {
            cout << "\nerror reading image" << endl;
            return -1;
        }
        namedWindow("Image", 1);
        imshow("Image", img);
        setMouseCallback("Image", drawRect);
        while (waitKey(20) != 27)  // wait until ESC is pressed
        {
            imshow("Image", img);
        }
        //save image with rectangles
        imwrite( "../pics/new_Image.jpg", img );
        return 0;
    }

};

现在,我想在主类中创建一个类drawSpaces的对象和Mat图像,然后在其上运行draw以获取新图像。但是,在构建时,我得到了错误消息 error: invalid use of non-static member function setMouseCallback("Image", drawRect); ,编译器指向了drawRect函数。

我已经看过这个问题的其他答案,大多数人似乎建议将drawRect更改为static。但是我不希望我的drawRect函数具有静态函数的功能,即在不存在实际的drawSpaces对象的情况下能够被调用。

感谢您提供任何帮助,包括编码风格!

编辑:使用

setMouseCallback("Image", drawSpaces::drawRect);

也没有帮助。

金·金

环境:g ++ 5.4(c ++ 11)+ OpenCV 3.3

的回调函数setMouseCallback("Image", callback);应始终为静态。因此,您应该将函数更改为:

static void drawRect(int event, int x, int y, int, void *param)

然后,您还应该修改您的类定义(一些与C ++有关的知识,您应该自己学习)以成功编译它。


我的结果:

在此处输入图片说明


//! 2017.12.22 23:13:58 CST
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

struct Rectangle {
    cv::Point startPoint;
    cv::Point endPoint;

};

class drawSpaces {
private:
    static Mat img;
    static int ix;
    static int iy;
    static std::list<Rectangle> rectList;

public:

    static void drawRect(int event, int x, int y, int, void *param) {
        if (event == CV_EVENT_LBUTTONDOWN) {
           //Save first point of rect
            ix = x;
            iy = y;
        } else if (event == CV_EVENT_LBUTTONUP) {
            //Save 2nd point of rect
            cv::rectangle(img, Point(ix, iy), Point(x, y), cv::Scalar(0, 255, 0), 1, LINE_AA);
            Rectangle rect;
            rect.startPoint = Point(ix, iy);
            rect.endPoint = Point(x, y);
            rectList.push_back(rect);
            }
        }

    int draw(Mat image) {
        img = image;
        if (img.empty()) {
            cout << "\nerror reading image" << endl;
            return -1;
        }
        namedWindow("Image", 1);
        imshow("Image", img);
        setMouseCallback("Image", drawRect);
        while (waitKey(20) != 27) {
            imshow("Image", img);
        }
        //save image with rectangles
        imwrite( "new_Image.jpg", img );
        return 0;
    }

};

int drawSpaces::ix =0;
int drawSpaces::iy =0;
Mat drawSpaces::img = Mat() ;
std::list<Rectangle> drawSpaces::rectList;



int main(){
    Mat img = imread("test.png");
    drawSpaces obj;
    obj.draw(img);

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Linux-信号:错误:无效使用非静态成员函数

无效使用非静态成员函数

Arduino错误(C ++):无效使用非静态数据成员

无效使用非静态成员函数C ++

线程错误:无效使用非静态成员函数

静态模板化成员函数的模板行为仅在头文件中

C ++ freeRTOS任务,无效使用非静态成员函数

头文件中的静态内联函数

使用静态库(.a)中的头文件(.h)

将成员函数作为函数变量传递时,无效使用非静态成员函数C ++

将ino sketch转换为C ++类,无效使用非静态成员函数

如何修复导入另一个库的库中的“非静态成员函数的无效使用”

C ++头文件中的静态函数

如何修复C ++中的“错误:无效使用非静态数据成员'tree :: root'”错误?

CC_SYNTHESIZE(int,beadColor,_BeadColor); 在非静态成员函数外部无效使用“ this”

在头文件中定义成员对象时调用非空构造函数

boost :: thread无效使用非静态成员函数

C ++无效使用非静态数据成员

pthread_create-无效使用非静态成员函数

无效使用非静态数据成员'Board :: N'

无效使用非静态成员函数-类成员函数调用另一个类成员函数

错误:无效使用非静态成员

非静态成员函数c++线程linux的无效使用

错误:非静态成员函数 C++ 的无效使用

如何设置 (*sa_handler)(int) 指向作为类成员的函数的指针?(非静态成员函数的无效使用)

错误:在 C++ 中无效使用非静态成员函数

非静态成员函数 int test::funcAB(int, int) 的无效使用

为什么不能使用#pragma once 在头文件中定义静态成员

头文件的静态类成员