Opencv 如何使用骨骼化图像创建三维曲面?

Opencv 如何使用骨骼化图像创建三维曲面?,opencv,3d,vtk,surface,Opencv,3d,Vtk,Surface,我正在使用OpenCV 3.1(与VTK7.1一起),并尝试使用2D图像创建类似3D的曲面 想法很简单: 输入连续图像(每帧视频流) 骨骼化处理每个帧 在三维空间中堆叠。问题是: 如何将图像转换为点云以及如何显示? 以下是代码的一部分: for (;;) { inStream >> singleFrm; if (singleFrm.empty()) { break; } else { imshow("Origin",

我正在使用OpenCV 3.1(与VTK7.1一起),并尝试使用2D图像创建类似3D的曲面

想法很简单:

  • 输入连续图像(每帧视频流)

  • 骨骼化处理每个帧

  • 在三维空间中堆叠。问题是: 如何将图像转换为点云以及如何显示?

  • 以下是代码的一部分:

    for (;;)
    {
        inStream >> singleFrm;
    
        if (singleFrm.empty()) {
            break;
        }
        else {
    
            imshow("Origin", singleFrm);
            singleFrm = singleFrm(roi);
            cvtColor(singleFrm, roiSkelFrm, CV_RGB2GRAY);
            const Size2d size(roiSkelFrm.cols, roiSkelFrm.rows);            
    
            threshold(roiSkelFrm, roiSkelFrm, 80, 255, cv::THRESH_BINARY);
            thinning(roiSkelFrm, roiSkelFrm);
    
            stackChFrm[0] = roiSkelFrm;
            stackChFrm[1] = roiSkelFrm;
            stackChFrm[2] = roiSkelFrm;
    
            cv::merge(stackChFrm, 3, skelFrm);
            skelFrm.convertTo(skelFrm, CV_32FC3);           
    
            viz::WCloud aCloudSlice(skelFrm, viz::Color::white());          
            myWindow.showWidget("image", aSlice);
    
            myWindow.spinOnce(1, true);
    
            if (waitKey(1) == 27)
                break;
        }
    }
    
    while (!myWindow.wasStopped())
    {
        myWindow.spinOnce(1, true);
    }  
    

    应该类似于“行进立方体”算法应该更容易:如果你知道或假设像素的3D宽度和高度以及图像(在堆栈中)的深度,你可以直接转换图像:图像_s(x,y)变成3D点(x×宽度,y×高度,s×深度),s是图像的堆栈级别。应该类似于“行进立方体”算法应该更简单:如果您知道或假设像素的3D宽度和高度以及图像(在堆栈中)的深度,您可以直接转换图像:图像_s(x,y)成为3D点(x×宽度,y×高度,s×深度),s为图像的堆栈级别。