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