图像内选择一个ROI(感兴趣区域)区域、区域外用黑色半透明图层遮挡。
也就是实现散景效果。
2D 图形,不涉及3D
Qt5.12.7
vtk-9.2
效果展示:
首先是初始化过程
也包含了设计方案。
定义12个顶点,画出4个半透明矩形。
//散景(背景模糊)
vtkSmartPointer<vtkPoints> m_pBokehPoints = nullptr;
vtkSmartPointer<vtkActor> m_pBokehActor[4]{ nullptr };
vtkSmartPointer<vtkAssembly> m_pBokehAssembly{ nullptr };
void InitBokeh()
{
//
// 3·------------------------------·2
// |/(区域1)///|
// |///|
// |/11/10/|
// 7·--------·----------·--------·6
// |/| |/|
// |(区域2)//| |//(区域3)|
// |/| |/|
// 4·--------·----------·--------·5
// |/8///9/|
// |///|
// |/(区域0)///|
// 0·------------------------------·1
//
m_pBokehPoints = vtkSmartPointer<vtkPoints>::New();
//最外层
m_pBokehPoints->InsertPoint(0, 0, 0, 0);
m_pBokehPoints->InsertPoint(1, 0, 0, 0);
m_pBokehPoints->InsertPoint(2, 0, 0, 0);
m_pBokehPoints->InsertPoint(3, 0, 0, 0);
//中层
m_pBokehPoints->InsertPoint(4, 0, 0, 0);
m_pBokehPoints->InsertPoint(5, 0, 0, 0);
m_pBokehPoints->InsertPoint(6, 0, 0, 0);
m_pBokehPoints->InsertPoint(7, 0, 0, 0);
//核心(透明区域)
m_pBokehPoints->InsertPoint(8 , 0, 0, 0);
m_pBokehPoints->InsertPoint(9 , 0, 0, 0);
m_pBokehPoints->InsertPoint(10, 0, 0, 0);
m_pBokehPoints->InsertPoint(11, 0, 0, 0);
auto funcPolygonGenerator = [](vtkNew<vtkPolygon>& polygon, int a, int b, int c, int d) {
;
polygon->GetPointIds()->SetNumberOfIds(4);
polygon->GetPointIds()->SetId(0, a);
polygon->GetPointIds()->SetId(1, b);
polygon->GetPointIds()->SetId(2, c);
polygon->GetPointIds()->SetId(3, d);
};
vtkNew<vtkPolygon> polygon[4];
funcPolygonGenerator(polygon[0],0,1,5,4); //区域0
funcPolygonGenerator(polygon[1],7,6,2,3); //区域1
funcPolygonGenerator(polygon[2],4,8,11,7); //区域2
funcPolygonGenerator(polygon[3],9,5,6,10); //区域3
m_pBokehAssembly = vtkSmartPointer<vtkAssembly>::New();
for (int i = 0; i < 4; ++i)
{
// 创建多边形数据
vtkSmartPointer<vtkCellArray> polygons = vtkSmartPointer<vtkCellArray>::New();
polygons->InsertNextCell(polygon[i]);
// 创建多边形数据对象
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
polyData->SetPoints(m_pBokehPoints);
polyData->SetPolys(polygons);
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polyData);
//VTK_MAPPER_TOPPING(mapper);
m_pBokehActor[i] = vtkSmartPointer<vtkActor>::New();
m_pBokehActor[i]->SetMapper(mapper);
m_pBokehActor[i]->GetProperty()->SetColor(GetColor3d_background()); // 设置为黑色
m_pBokehActor[i]->GetProperty()->SetOpacity(0.8); // 设置半透明度
m_pBokehActor[i]->SetPickable(false);
m_pBokehAssembly->AddPart(m_pBokehActor[i]);
}
//默认让矩形框不可见
m_pBokehAssembly->SetVisibility(false);
//把装配体加到场景中
DefaultRenderer->AddActor(m_pBokehAssembly);
}
设置矩形最外层四个顶点(0,1,2,3 四个点)
这四个点会影响到(4,5,6,7)四个点的X轴坐标.
void SetBokehExtent(const int extent[6])
{
m_pBokehPoints->SetPoint(0, extent[0], extent[2], 0);
m_pBokehPoints->SetPoint(1, extent[1], extent[2], 0);
m_pBokehPoints->SetPoint(2, extent[1], extent[3], 0);
m_pBokehPoints->SetPoint(3, extent[0], extent[3], 0);
//中层
m_pBokehPoints->SetPoint(4, extent[0], m_pBokehPoints->GetPoint(4)[1], 0);
m_pBokehPoints->SetPoint(5, extent[1], m_pBokehPoints->GetPoint(5)[1], 0);
m_pBokehPoints->SetPoint(6, extent[1], m_pBokehPoints->GetPoint(6)[1], 0);
m_pBokehPoints->SetPoint(7, extent[0], m_pBokehPoints->GetPoint(7)[1], 0);
}
移动内部透明区域位置
更细致的判断按需求增加。
void MoveBokeh(double diagonalP0[3], double diagonalP1[3])
{
double minX = 0, maxX = 0, minY = 0, maxY = 0;
//给坐标排序;求出坐下、右上
diagonalP0[0] > diagonalP1[0] ? (maxX = diagonalP0[0]) && (minX = diagonalP1[0]) : (minX = diagonalP0[0]) && (maxX = diagonalP1[0]);
diagonalP0[1] > diagonalP1[1] ? (maxY = diagonalP0[1]) && (minY = diagonalP1[1]) : (minY = diagonalP0[1]) && (maxY = diagonalP1[1]);
double p0[3]{ minX,minY,0 }, p1[3]{ maxX,minY,0 }, p2[3]{ maxX,maxY,0 }, p3[3]{ minX,maxY,0 };
//中层
m_pBokehPoints->SetPoint(4, m_pBokehPoints->GetPoint(4)[0], p0[1], 0);
m_pBokehPoints->SetPoint(5, m_pBokehPoints->GetPoint(5)[0], p0[1], 0);
m_pBokehPoints->SetPoint(6, m_pBokehPoints->GetPoint(6)[0], p3[1], 0);
m_pBokehPoints->SetPoint(7, m_pBokehPoints->GetPoint(7)[0], p3[1], 0);
//核心(透明区域)
m_pBokehPoints->SetPoint(8, p0);
m_pBokehPoints->SetPoint(9, p1);
m_pBokehPoints->SetPoint(10, p2);
m_pBokehPoints->SetPoint(11, p3);
//刷新点的位置;设置装配体为可见
m_pBokehPoints->Modified();
//这一行按需求来
m_pBokehAssembly->SetVisibility(true);
}
注:vtkAssembly 也继承自vtkProp3D 也相当于一个演员(Actor).
它是多个Actor的装配体,可以统一控制显隐、位置等信息。可以很方便的控制Actor