30/09/2018, 17:08

Lỗi "vector subscript out of range" trong bài toán tìm intersection point?

Chào mọi người!

Mình xin cần được giúp đỡ, mình đang làm một cái ứng dụng phát hiện làn đường nhưng bị lỗi “vector subscript out of range”. Cụ thể như sau:

  • Đầu tiên, đầu vào là một vector lines được tìm thấy bằng hàm houghline trong opencv. Nó gồm tập hợp các đường thẳng biểu diễn bởi (r,theta). Mình cần convert các line này sang không gian Cartesian với vector endPoints bằng hàm sau:
    // Draw Lines on the image
Mat laneDetection::drawLines(Mat img, vector<Vec2f> lines, string name){

	Mat imgRGB;
	cvtColor(img,imgRGB,CV_GRAY2RGB); // converting the image to RGB for display
	vector<Point> endPoints;

	// Here, I convert the polar coordinates to Cartesian coordinates.
	// Then, I extend the line to meet the boundary of the image.
	for (int i = 0;i < lines.size();i++){
		float r = lines[i][0];
		float t = lines[i][1];
		
		float x = r*cos(t);
		float y = r*sin(t);

		Point p1(cvRound(x - 1.0*sin(t)*1000), cvRound(y + cos(t)*1000));
		Point p2(cvRound(x + 1.0*sin(t)*1000), cvRound(y - cos(t)*1000));

		clipLine(img.size(),p1,p2);
		if (p1.y > p2.y){
			endPoints.push_back(p1);
			endPoints.push_back(p2);
		}
		else{
			endPoints.push_back(p2);
			endPoints.push_back(p1);
		}

	}

Sau đó mình tìm điểm giao nhau của 2 line này, rồi chỉ hiển thị phần từ đầu đến điểm giao nhau này (nếu tìm thấy):

    ///// Finding the intersection point of two lines to plot only lane markings till the intersection
	Point pint;
	bool check = findIntersection(endPoints,pint);

	if (check){
		line(imgRGB,endPoints[0],pint,Scalar(0,255,255),5);
		line(imgRGB,endPoints[2],pint,Scalar(0,255,255),5);
	}	
	/////

	// Saving to intercepts.csv
	float xIntercept = min(endPoints[0].x,endPoints[2].x);
	myfile << name << "," << xIntercept * 2 << "," << pint.x * 2 << endl;

	visualize(imgRGB); // Visualize the final result

	return imgRGB;
}

// Finding the Vanishing Point
bool laneDetection::findIntersection(vector<Point> endP, Point& pi){

	Point x = endP[2] - endP[0];
	Point d1 = endP[1] - endP[0];
	Point d2 = endP[3] - endP[2];
	
	float cross = d1.x*d2.y - d1.y*d2.x;
	if (abs(cross) < 1e-8) // No intersection
        return false;

    double t1 = (x.x * d2.y - x.y * d2.x)/cross;
    pi = endP[0] + d1 * t1;
    return true;


}

Vấn đề là mình luôn bị gặp lỗi “vector subscript out of range” khi chương trình chạy tới hàm

bool laneDetection::findIntersection(vector<Point> endP, Point& pi).

Xin mọi người giúp đỡ mình! Cám ơn rất nhiều!!!

Mai Anh Dũng viết 19:12 ngày 30/09/2018

Toàn bộ code có phải trông như thế này không? Bạn tách code ra khó nhìn qúa

// Draw Lines on the image
Mat laneDetection::drawLines(Mat img, vector<Vec2f> lines, string name)
{

    Mat imgRGB;
    cvtColor(img,imgRGB,CV_GRAY2RGB); // converting the image to RGB for display
    vector<Point> endPoints;

    // Here, I convert the polar coordinates to Cartesian coordinates.
    // Then, I extend the line to meet the boundary of the image.
    for (int i = 0; i < lines.size(); i++)
    {
        float r = lines[i][0];
        float t = lines[i][1];

        float x = r*cos(t);
        float y = r*sin(t);

        Point p1(cvRound(x - 1.0*sin(t)*1000), cvRound(y + cos(t)*1000));
        Point p2(cvRound(x + 1.0*sin(t)*1000), cvRound(y - cos(t)*1000));

        clipLine(img.size(),p1,p2);
        if (p1.y > p2.y)
        {
            endPoints.push_back(p1);
            endPoints.push_back(p2);
        }
        else
        {
            endPoints.push_back(p2);
            endPoints.push_back(p1);
        }

    }
    // Finding the intersection point of two lines to plot only lane markings till the intersection
    Point pint;
    bool check = findIntersection(endPoints,pint);

    if (check)
    {
        line(imgRGB,endPoints[0],pint,Scalar(0,255,255),5);
        line(imgRGB,endPoints[2],pint,Scalar(0,255,255),5);
    }

    // Saving to intercepts.csv
    float xIntercept = min(endPoints[0].x,endPoints[2].x);
    myfile << name << "," << xIntercept * 2 << "," << pint.x * 2 << endl;

    visualize(imgRGB); // Visualize the final result

    return imgRGB;
}

// Finding the Vanishing Point
bool laneDetection::findIntersection(vector<Point> endP, Point& pi)
{

    Point x = endP[2] - endP[0];
    Point d1 = endP[1] - endP[0];
    Point d2 = endP[3] - endP[2];

    float cross = d1.x*d2.y - d1.y*d2.x;
    if (abs(cross) < 1e-8) // No intersection
        return false;

    double t1 = (x.x * d2.y - x.y * d2.x)/cross;
    pi = endP[0] + d1 * t1;
    return true;
}
Duc Vo Ngoc viết 19:23 ngày 30/09/2018

Đúng rồi đó A Đạt. Xin giúp đỡ!

Mai Anh Dũng viết 19:09 ngày 30/09/2018

Em chỉ bị lỗi này khi vào hàm findIntersection?

Duc Vo Ngoc viết 19:24 ngày 30/09/2018

Dạ, đúng rồi! Nó luôn báo lỗi về vector endP

Mai Anh Dũng viết 19:19 ngày 30/09/2018

Thêm dòng

std::cout << "size :" << endP.size() << std::endl;

Vào đầu hàm findIntersection coi thử size của endP là bao nhiêu?

Duc Vo Ngoc viết 19:20 ngày 30/09/2018

std::cout << “size :” << endP.size() << std::endl;

Em đã thêm vào đầu hàm findIntersection. Nó trả về size=0. Tại sao vậy anh?

Mai Anh Dũng viết 19:16 ngày 30/09/2018

Chắc là vòng for này có lỗi nào đấy, dẫn đến không push_back được. Debug chỗ này xem?

for (int i = 0; i < lines.size(); i++)
{
    float r = lines[i][0];
    float t = lines[i][1];

    float x = r*cos(t);
    float y = r*sin(t);

    Point p1(cvRound(x - 1.0*sin(t)*1000), cvRound(y + cos(t)*1000));
    Point p2(cvRound(x + 1.0*sin(t)*1000), cvRound(y - cos(t)*1000));

    clipLine(img.size(),p1,p2);
    if (p1.y > p2.y)
    {
        endPoints.push_back(p1);
        endPoints.push_back(p2);
    }
    else
    {
        endPoints.push_back(p2);
        endPoints.push_back(p1);
    }
}
Duc Vo Ngoc viết 19:24 ngày 30/09/2018

Em đã test, em chắc là do em chạy đoạn video nên có lúc hàm hough không phát hiện ra được các line, nghĩa là vector line ko có giá trị. Do đó lines.size() =0, Anh có nghĩ em nên kiểm tra giá trị của vector line trước khi cho vòng for chạy ko?

Mai Anh Dũng viết 19:19 ngày 30/09/2018

Sao không kiểm tra lúc phát hiện line đấy. Xác định lại xem nếu không phát hiện line nào hết thì mình sẽ phải làm gì.

Duc Vo Ngoc viết 19:12 ngày 30/09/2018

Cám ơn anh. Em sẽ xem lại code!

Bài liên quan
0