私はC/C++をかなり新しくしており、次の問題があります。 exectuableの一部として、私は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の対象とマット・イメージを作成し、新しいイメージを得るためにそれに引き分けを実行したいです。しかし、ビルド時に、私はエラーメッセージ error: invalid use of non-static member function setMouseCallback("Image", drawRect);
を取得し、コンパイラはdrawRect関数を指しています。
私はこの質問で他の答えを見てきました。大多数は、drawRectを静的に変更するよう提案しています。しかし私は、私のdrawRect関数が静的関数の機能を持つ、つまり実際のdrawSpacesオブジェクトが存在しないまま呼び出せるようにすることは望ましくありません。
どのようなヘルプも、コーディングのスタイルで、感謝しています!
EDIT:
setMouseCallback("Image", drawSpaces::drawRect);
を使用すると、いずれか助けていません。
。混乱して申し訳ありませんが、可能な限り短くしたいと考えました。 – emilaz
エラーの説明はエラーです。メンバ関数をパラメータとして直接使用することはできません。 drawSpaces :: drawRectを試してください – leyanpan
あなたの提案をありがとう。私はそれを試みましたが、それは表示されているエラーに違いはありません。 – emilaz