代码排版

本文介绍了一种实现3D立体图像可视化的方法,通过关键帧处理、视点控制器、立体图绘制等技术,实现图像的实时交互与展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class StereoPlotTest : public IKeyHandler
{
private:
	Flag close;
	Flag pause;
	Flag gray;
private:
    Bool supportOnKey() {return TRUE;}
	void onKey(String port, Key key)
	{
		switch (key)
		{	case K_Esc:
				close.set();
				break;
			case K_P:
				if (pause.check()) pause.reset();
				else pause.set();
				break;
			case K_G:
				if (gray.check()) gray.reset();
				else gray.set();
				break;
			default:
				break;
		}
	}
public:
	void runWithID(Image frameL,Image frameR)
	{
		Log log(moduleName, "Program.run");
        // offsets to make things move
		Float pointOffset = 0.0f;
        // initialize view point controller
		Point3D position = Point3D(0.0f, 12.f, 12.0f);		// a 175cm man
		ViewPointController controller(ViewPoint(position, RotateAngles(), 75.0f));
		controller.setDefaultKeyHandler(this);
        controller.setSensitivity(3);
        // initialize plotter
		StereoPlot plot;
		plot.setAntiAliasing(0);
		// main loop
		Timer offsetTimer;
		UInt imageCount = 0;
		Image image, imageInfo;
		Float HRadius =2.0f ,WRadius = 5.0f;
		Module3D BufObject;
		PointsArray ArrayPlot=BufObject.ArrayWithIndex(frameL,frameR,HRadius,WRadius);
		Array<Point3DIndexType> HNode = ArrayPlot.Harris;
		Array<Point3DIndexType> WNodeMin  = ArrayPlot.WaterMin;
		Array<Point3DIndexType> WNodeMax = ArrayPlot.WaterMax;
		UInt line_num = HNode.size();
		Image frame1;
		frame1.copy(frameL);
		TrianglePlot TriangleC=BufObject.TriangleArray(frameL,frameR,HRadius,WRadius);
        // create windows
		Window window;
		window.setKeyHandler(&controller);
		window.create("3D Plot");
		while (!close.check())
		{
			// set the view point
			plot.setViewPoint(controller.viewPoint());
			if (!pause.check())
			{
				// plot points
				//show the waternode
				Array<Point3D>  WaterNode(WNodeMin.size());
				for (UInt i = 0; i < WNodeMin.size(); i++)
				{	
					WaterNode[i] = WNodeMin[i].Coordi3D;
				}
				plot.plotPoints("watershed min node", WaterNode, ColorRGB(0,0,255), 0.01f);
				Array<Point3D>  WaterNodemax(WNodeMax.size());
				for (UInt i = 0; i < WNodeMax.size(); i++)
				{	
					WaterNodemax[i] = WNodeMax[i].Coordi3D;
				}
				plot.plotPoints("watershed  max node", WaterNodemax, ColorRGB(255,0,0), 0.01f);
			
				Array<Point3D>  HarrisNode(HNode.size());
				for (UInt i = 0; i < HNode.size(); i++)
				{	
					HarrisNode[i] = HNode[i].Coordi3D;
				}
				plot.plotPoints("harris node", HarrisNode, ColorRGB(0,255,0), 0.01f);
				
				Array<Line3D> lines(line_num);	
				UInt linesCount = 0;
				for ( UInt l = 0,i = 0; i < WNodeMin.size(); i++)
				{
					for (UInt k = 0;k < HNode.size(); k++)
					{		
						if( HNode[k].Coordi3D.x >0 &&HNode[k].MinIndex > 0 && WNodeMin[i].MinIndex == HNode[k].MinIndex)
						{
							lines[l].p1 = WNodeMin[i].Coordi3D;
							lines[l].p2 = HNode[k].Coordi3D;	
							l++;
							linesCount++;					
						}					
					}
				}
				plot.plotLines("spiral",lines, ColorRGB(0,0,255), 0.01f);
				Array<Line3D> linesmax(line_num);	
				for ( UInt l = 0,i = 0; i < WNodeMax.size(); i++)
				{
					for (UInt k = 0;k < HNode.size(); k++)
					{		
						if( HNode[k].Coordi3D.x >0 &&HNode[k].MaxIndex > 0 && WNodeMax[i].MaxIndex == HNode[k].MaxIndex)
						{
							linesmax[l].p1 = WNodeMax[i].Coordi3D;
							linesmax[l].p2 = HNode[k].Coordi3D;	
							l++;	
							//console::print("here");
							//waitKey();
						}					
					}
				}
				plot.plotLines("spiral max",linesmax, ColorRGB(0,255,0), 0.01f);
				plot.plotTextures("min",TriangleC.TriMin3D,TriangleC.TriMin2D,frame1);
				plot.plotTextures("max",TriangleC.TriMax3D,TriangleC.TriMax2D,frame1);
			}
			// query the rendered frame
			while (!plot.getImageFrame(image, imageCount)) thread::waitTime(1);			
			// show the frame
			if (gray.check())
			{
				Image imageGray;
				image.convertTo(imageGray, PF_ByteGray);
				window.writeImageFrame(imageGray);
			}
			else window.writeImageFrame(image);		
			// update offsets and wait time
			Float offsetTime = offsetTimer.check();
			offsetTimer.start();	
			if (!pause.check())
			{
				pointOffset += 0.01f * offsetTime;
			}		
			thread::waitTime(1);	
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值