Ask Your Question

Revision history [back]

opencv projectPoints error

Hi guys

I'm trying to find a way to project a 3D point onto a 2D silhouette image.

I am using projectPoints and the parameters obtained from the calibratecamera functions.

I get the following error

OpenCV Error: Assertion failed (0 <= i && i < (int)v.size()) in unknown function file ...... \matrix.cpp, line 981.

below is my code

#include<vector>
#include<opencv\cv.h>
#include<opencv\highgui.h>
#include<opencv2/imgproc/imgproc.hpp>
#include<cstdlib>
#include<iostream>
#include<cmath>

#include"reconstruction.h"

using namespace cv;
using namespace std;

int main()
{
    Mat image, grayscale;
    int numcorners, horcorner,vercorner;
    Mat icovar;
    Scalar meanmat;
    int k=1;
    //covariance for dark combined
    double covar[3][3]={{180.1437, 180.8316, 179.0236},{188.8316,355.5152,238.8029},{179.0236,238.8029,267.9239}};
    meanmat[0]=13.8340;
    meanmat[1]=68.3459;
    meanmat[2]=22.7451;

    Mat covmat(3,3,CV_64F,covar);

    Mat mask = Mat::zeros(480, 640, CV_8UC1);   //create matrix same size as image which is 480 by 640 based on the webcam capture
    //intitialize capture
    Vec3b pixel;
    double distance = 200;
    double mdist=0;
    float x,y,z;

    icovar=inversemat(covmat);      //determinant of covariance matrix is zero. SOLVED

    Mat corners;
    printf("Enter number of corners horizontally: ");
    scanf("%d", &horcorner);
    printf("Enter number of corners vertically: ");
    scanf("%d", &vercorner);
    numcorners=horcorner*vercorner;

    vector<vector<Point3f>> object_points;
    vector<vector<Point2f>> image_points;

    vector<Point3f> obj;
    vector<Point2f> img;

    vector<Point3f> threedpoint;
    vector<Point2f> projectedpoints;

    Mat intrinsic = Mat(3, 3, CV_32FC1);
    Mat distCoeffs;
    vector<Mat> rvecs;
    vector<Mat> tvecs;
    intrinsic.ptr<float>(0)[0] = 1;
    intrinsic.ptr<float>(1)[1] = 1;

    printf("Enter the distance between the two marked corners in the x direction (mm): ");
    scanf("%f",&x);
    printf("Enter the distance between the two marked corners in the y direction (mm): ");
    scanf("%f",&y);
    printf("Enter the height of the object (mm): ");
    scanf("%f",&z);

    int sz[] = {x,y,z};

    Mat threedimension(3,sz,CV_32F,Scalar::all(1));  //create 3dim matrix, type 32 filled with 1s.

    VideoCapture webcam;
    webcam.open(-1);    
    while(1)
    {
        //copy webcam stream to image
        webcam>>image;
        if(!webcam.isOpened())
        {
            cout<<"\nThe Camera is being used by another application, make sure all applications using the camera are closed and try running this program again."<<endl;
            break;
        }
        for(int i = 0; i < image.rows;i++)
        {
            for(int j=0; j<image.cols;j++)  //in case it fails changed it from i=1 to i=0
            {
                pixel= image.at<Vec3b>(i,j);    //prints wierd characters
                mdist=mahadistance(icovar,meanmat,pixel);
                if(mdist<distance)
                    mask.at<uchar>(i,j)=255;
                else
                    mask.at<uchar>(i,j)=0;
            }
        }
        cvtColor(image,grayscale,CV_BGR2GRAY);
        //goodfeatures(grayimage, output to store corners, quality factor, distance factor)
        goodFeaturesToTrack(grayscale,corners,numcorners,0.1,100);   //good so far 0.1 and 100 also 0.01 and 100 a little ok i chose this
        // Mark these corners on the original image
        cornerSubPix(grayscale, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
        if(corners.rows==numcorners)
        {
            for(int i=0;i<corners.rows;i++)
            {
                //draws circle on image, at centre at point, color, thickness, line type, 
                circle(image,corners.at<Point2f>(i),3,CV_RGB(255,0,0),1,8,0);
                obj.push_back(Point3f(float(i/vercorner), float(i%vercorner), 0.0f));       //setting up the units of calibration
                img.push_back(corners.at<Point2f>(i));      
            }
            image_points.push_back(img);
            object_points.push_back(obj);

            calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs);    //unhandled exception error at this point not because of too much points

            for(float l=0;l<x;l++)
            {
                for(float w=0;w<y;w++)
                {
                    for(float h=0;h<z;h++)
                    {
                        threedpoint.push_back(Point3f(l, w, h));        
                        projectPoints(threedpoint,rvecs,tvecs,intrinsic,distCoeffs,projectedpoints);
                        //access each element of threedimension.at<float>(x,y,z)
                        if(threedimension.at<float>(l,w,h)==1)
                        {
                            if(float(mask.at<uchar>(projectedpoints[0]))==255)
                            {
                                threedimension.at<float>(l,w,h)=0;
                            }
                        }
                        threedpoint.clear();
                    }
                }
            }
            Mat image_aux = image;
            imshow("original", image_aux);
            imshow("mask",mask);
        }

        img.clear();
        obj.clear();
        image_points.clear();
        object_points.clear();
    }
    webcam.release();
    system("PAUSE");
    return 0;
}

I don't know what is wrong, I am sure i am doing everything correctly, i tried all different combinations but still error.

Also one more thing is that the time it takes to execute one frame is around 6 seconds, which is too slow if someone can see if i can correct or change my code to improve the execution time, i would appreciate it.

thanks

opencv projectPoints error

Hi guys

I'm trying to find a way to project a 3D point onto a 2D silhouette image.

I am using projectPoints and the parameters obtained from the calibratecamera functions.

I get the following errorerror when it tries to execute the projectpoints function

OpenCV Error: Assertion failed (0 <= i && i < (int)v.size()) in unknown function file ...... \matrix.cpp, line 981.

below is my code

#include<vector>
#include<opencv\cv.h>
#include<opencv\highgui.h>
#include<opencv2/imgproc/imgproc.hpp>
#include<cstdlib>
#include<iostream>
#include<cmath>

#include"reconstruction.h"

using namespace cv;
using namespace std;

int main()
{
    Mat image, grayscale;
    int numcorners, horcorner,vercorner;
    Mat icovar;
    Scalar meanmat;
    int k=1;
    //covariance for dark combined
    double covar[3][3]={{180.1437, 180.8316, 179.0236},{188.8316,355.5152,238.8029},{179.0236,238.8029,267.9239}};
    meanmat[0]=13.8340;
    meanmat[1]=68.3459;
    meanmat[2]=22.7451;

    Mat covmat(3,3,CV_64F,covar);

    Mat mask = Mat::zeros(480, 640, CV_8UC1);   //create matrix same size as image which is 480 by 640 based on the webcam capture
    //intitialize capture
    Vec3b pixel;
    double distance = 200;
    double mdist=0;
    float x,y,z;

    icovar=inversemat(covmat);      //determinant of covariance matrix is zero. SOLVED

    Mat corners;
    printf("Enter number of corners horizontally: ");
    scanf("%d", &horcorner);
    printf("Enter number of corners vertically: ");
    scanf("%d", &vercorner);
    numcorners=horcorner*vercorner;

    vector<vector<Point3f>> object_points;
    vector<vector<Point2f>> image_points;

    vector<Point3f> obj;
    vector<Point2f> img;

    vector<Point3f> threedpoint;
    vector<Point2f> projectedpoints;

    Mat intrinsic = Mat(3, 3, CV_32FC1);
    Mat distCoeffs;
    vector<Mat> rvecs;
    vector<Mat> tvecs;
    intrinsic.ptr<float>(0)[0] = 1;
    intrinsic.ptr<float>(1)[1] = 1;

    printf("Enter the distance between the two marked corners in the x direction (mm): ");
    scanf("%f",&x);
    printf("Enter the distance between the two marked corners in the y direction (mm): ");
    scanf("%f",&y);
    printf("Enter the height of the object (mm): ");
    scanf("%f",&z);

    int sz[] = {x,y,z};

    Mat threedimension(3,sz,CV_32F,Scalar::all(1));  //create 3dim matrix, type 32 filled with 1s.

    VideoCapture webcam;
    webcam.open(-1);    
    while(1)
    {
        //copy webcam stream to image
        webcam>>image;
        if(!webcam.isOpened())
        {
            cout<<"\nThe Camera is being used by another application, make sure all applications using the camera are closed and try running this program again."<<endl;
            break;
        }
        for(int i = 0; i < image.rows;i++)
        {
            for(int j=0; j<image.cols;j++)  //in case it fails changed it from i=1 to i=0
            {
                pixel= image.at<Vec3b>(i,j);    //prints wierd characters
                mdist=mahadistance(icovar,meanmat,pixel);
                if(mdist<distance)
                    mask.at<uchar>(i,j)=255;
                else
                    mask.at<uchar>(i,j)=0;
            }
        }
        cvtColor(image,grayscale,CV_BGR2GRAY);
        //goodfeatures(grayimage, output to store corners, quality factor, distance factor)
        goodFeaturesToTrack(grayscale,corners,numcorners,0.1,100);   //good so far 0.1 and 100 also 0.01 and 100 a little ok i chose this
        // Mark these corners on the original image
        cornerSubPix(grayscale, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
        if(corners.rows==numcorners)
        {
            for(int i=0;i<corners.rows;i++)
            {
                //draws circle on image, at centre at point, color, thickness, line type, 
                circle(image,corners.at<Point2f>(i),3,CV_RGB(255,0,0),1,8,0);
                obj.push_back(Point3f(float(i/vercorner), float(i%vercorner), 0.0f));       //setting up the units of calibration
                img.push_back(corners.at<Point2f>(i));      
            }
            image_points.push_back(img);
            object_points.push_back(obj);

            calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs);    //unhandled exception error at this point not because of too much points

            for(float l=0;l<x;l++)
            {
                for(float w=0;w<y;w++)
                {
                    for(float h=0;h<z;h++)
                    {
                        threedpoint.push_back(Point3f(l, w, h));        
                        projectPoints(threedpoint,rvecs,tvecs,intrinsic,distCoeffs,projectedpoints);
                        //access each element of threedimension.at<float>(x,y,z)
                        if(threedimension.at<float>(l,w,h)==1)
                        {
                            if(float(mask.at<uchar>(projectedpoints[0]))==255)
                            {
                                threedimension.at<float>(l,w,h)=0;
                            }
                        }
                        threedpoint.clear();
                    }
                }
            }
            Mat image_aux = image;
            imshow("original", image_aux);
            imshow("mask",mask);
        }

        img.clear();
        obj.clear();
        image_points.clear();
        object_points.clear();
    }
    webcam.release();
    system("PAUSE");
    return 0;
}

I don't know what is wrong, I am sure i am doing everything correctly, i tried all different combinations but still error.

Also one more thing is that the time it takes to execute one frame is around 6 seconds, which is too slow if someone can see if i can correct or change my code to improve the execution time, i would appreciate it.

thanks