我目前正在尝试在OpenCV中生成立体图像对的3D点.据我所知,这已经完成了很多工作.
我知道我要假设的立体声设置的外部参数是正面并行配置(实际上,它并没有那么糟糕!).我知道焦距,基线,我将假设主要点作为图像的中心(我知道,我知道......).
我使用StereoSGBM计算了一个伪装的视差图,并在O'Reilly的Learning OpenCV书之后对Q矩阵进行了手工编码,该书指定:
Q = [ 1 0 0 -c_x
0 1 0 -c_y
0 0 0 f
0 0 -1/T_x (c_x - c_x')/T_x ]
Run Code Online (Sandbox Code Playgroud)
我会认为(c_x,c_y)是主要点(我在图像坐标中指定),f是焦距(我用mm描述),而T_x是两个相机或基线之间的平移(我是也在mm中描述.
int type = CV_STEREO_BM_BASIC;
double rescx = 0.25, rescy = 0.25;
Mat disparity, vdisparity, depthMap;
Mat frame1 = imread( "C:\\Users\\Administrator\\Desktop\\Flow\\IMG137.jpg", CV_LOAD_IMAGE_GRAYSCALE );
Mat frame1L = frame1( Range( 0, frame1.rows ), Range( 0, frame1.cols/2 ));
Mat frame1R = frame1( Range( 0, frame1.rows ), Range( frame1.cols/2, frame1.cols ));
resize( frame1L, frame1L, Size(), rescx, rescy ); …
Run Code Online (Sandbox Code Playgroud) 我已经在这个问题上工作了很长一段时间,并且在我的创造力结束时,所以希望其他人可以帮助我指出正确的方向.我一直在使用Kinect并尝试将数据捕获到MATLAB.幸运的是,有很多方法可以这样做(我目前正在使用http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab).当我试图将捕获的数据投影到3D时,我的传统方法给出了很差的重建结果.
简而言之,我最终为matlab编写了一个Kinect SDK包装器,用于执行重建和对齐.重建就像一场梦,但......
正如您在此处所看到的,我在对齐方面遇到了很多麻烦:
请不要仔细看模型:(.
如您所见,对齐方式不正确.我不确定为什么会这样.我已经阅读了很多论坛,其他人使用相同的方法比我更成功.
我目前的管道是使用Kinect Matlab(使用Openni)捕获数据,使用Kinect SDK重建,然后使用Kinect SDK(通过NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution)进行对齐.我怀疑这可能是由于Openni,但我在使用Kinect SDK创建mex函数调用捕获方面收效甚微.
如果有人能指出我应该深入研究的方向,那将非常感激.
编辑:
图一我应该发布一些代码.这是我用于对齐的代码:
/* The matlab mex function */
void mexFunction( int nlhs, mxArray *plhs[], int nrhs,
const mxArray *prhs[] ){
if( nrhs < 2 )
{
printf( "No depth input or color image specified!\n" );
mexErrMsgTxt( "Input Error" );
}
int width = 640, height = 480;
// get input depth data
unsigned short *pDepthRow = ( unsigned short* ) mxGetData( prhs[0] );
unsigned char *pColorRow …
Run Code Online (Sandbox Code Playgroud) 我想在Android中使用OpenCV.所以我首先通过并排放置两个SurfaceView来测试OpenCV.一个SurfaceView用于从相机预览输出(输出格式显然是NV21).另一个SurfaceView在通过OpenCV后显示相同的预览,如下面的代码所示:
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
if( mYuv != null ) mYuv.release();
mYuv = new Mat( height + height/2, width, CvType.CV_8UC1 );
mYuv.put( 0, 0, data);
Mat mRgba = new Mat();
Imgproc.cvtColor( mYuv, mRgba, Imgproc.COLOR_YUV2RGB_NV21, 4 );
Bitmap map = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );
Utils.matToBitmap( mRgba, map );
preview.setBackgroundDrawable( new BitmapDrawable( map ));
mRgba.release();
}
Run Code Online (Sandbox Code Playgroud)
但是通过OpenCV后产生的图像是一个绿色的,有条理的......事情:
有任何想法吗?
编辑:
根据评论修改了一点代码.
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
if( …
Run Code Online (Sandbox Code Playgroud)