我是c ++编码的巴西初学者(道歉我对这两方面的知识不足)。我试图写一个.txt输出文件,其中包含我用鼠标点击的像素位置。我正在使用opencv库,因此这是代码的一个功能部分:
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
using namespace cv;
//declaration of vector and counter
int i = 1;
std::vector<int>vet_x(i);
std::vector<int>vet_y(i);
//the callback function
void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
if (event == EVENT_LBUTTONDOWN)
{
vet_x.resize(i);
vet_y.resize(i);
vet_x[i] = x;
vet_y[i] = y;
i++;
cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
}
}
int main(int argc, char** argv)
{
Mat img = imread("lena.jpg");
//Create a window
namedWindow("Mouse Track Test", 1);
//set the callback function for mouse event
setMouseCallback("Mouse Track Test", CallBackFunc, NULL);
//show the image
imshow("Mouse Track Test", img);
// Wait until user press some key
waitKey(0);
//the writing begins after the press of the key
ofstream myfile;
myfile.open("points.txt");
for (int j = 1; j <= vet_x.size(); j++)
{
cout << vet_x[j] << "," << vet_y[j] << endl;
myfile << vet_x[j] << "," << vet_y[j] << endl;
}
myfile.close();
return 0;
}
问题是:文件只写最后点击的位置! 但是,如果我转动&#34; vet_x.reserve(1024);&#34;线,它运作良好,但仅适用于y坐标......
那么,我的错误是什么?
答案 0 :(得分:2)
C ++数组索引是基于0的。因此,当您将向量v
的大小调整为1并指定给v[1]
时,您将分配给不存在的项目。这是未定义的行为。
要捕获这种越界索引,您可以使用at
方法,这可以保证异常。即,写v.at(i)
而不是v[i]
。
但是,您应该只使用push_back
成员函数向向量添加项目。即,v.push_back( x )
,其中x
是您要添加的值。使用2D点的单个矢量,而不是x的一个矢量和y的一个矢量也是一个好主意。
答案 1 :(得分:1)
vet_x.resize(i);
vet_y.resize(i);
vet_x[i]=x;
vet_y[i]=y;
您指定元素超出范围,这是一种未定义的行为。 resize(i)
后最后一个有效索引为i-1
。 std::vector operator [] never insert elements in the container.
而只是做
vet_x.push_back(x);
vet_y.push_back(y);
答案 2 :(得分:0)
将变量添加到向量中的方法是错误的。我建议这个:
struct Point
{
int x, y;
Point(int sx, int sy)
:x(sx),y(sy)
{
}
};
std::vector<Point> clickedPositions;
//the callback function
void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
if ( event == EVENT_LBUTTONDOWN )
{
clickedPositions.push_back(Point(x,y));
}
}
并将其写入文件:
for(int j=0; j<clickedPositions.size(); j++)
{
myfile << clickedPositions[j].x < <","<< clickedPositions[j].y <<endl;
}