形狀效果 c++
形狀效果:顯示目標區域位置不變,顯示內容(原始陣不變,屏蔽陣變化 -> 顯示內容變化)ui
enum CbwShapeDirection { // 形狀方向spa
csdZoomIn = 0, // 放大it
csdZoomOut = 1 // 縮小io
};ast
enum CbwShapeType { // 形狀類型im
cstCircle = 0, // 圓call
cstRect = 1, // 方框top
cstDiamond = 2, // 菱形img
cstPlus = 3 // 加號
};
bool __fastcall TCbwAnimationEffect_Shape::BuildMaskMat(cv::Mat& destMat,
cv::Mat& srcMat, TRect displayRect) {
int zoomType = MyOptionType.Items[1].CurrentValue; // 放大、縮小
int shapeType = MyOptionType.Items[2].CurrentValue; // 類型
TRect wholeRect(0, 0, displayRect.right - displayRect.left,
displayRect.bottom - displayRect.top);
double cx = wholeRect.right / 2.0, cy = wholeRect.bottom / 2.0;
double deltaX = double(FCurrentIndex + 1) / FTotalFramesInOnePeriod * cx;
double deltaY = double(FCurrentIndex + 1) / FTotalFramesInOnePeriod * cy;
double startX = deltaX, startY = deltaY;
if (zoomType == csdZoomOut) {
startX = cx - deltaX;
startY = cy - deltaY;
}
BYTE * pSrc = srcMat.data;
BYTE * pDst = destMat.data;
for (int row = 0; row < destMat.rows; ++row)
for (int col = 0; col < destMat.cols; ++col) {
bool hasValueFlag = (*pSrc++ != 0);
if (!hasValueFlag)
* pDst = 0;
bool inFlag = false;
double a = (cx - startX) * 1.5, b = (cy - startY) * 1.5;
if (shapeType == cstCircle) { // 圓
if (a > 0 && b > 0) {
double v = (row - cy) * (row - cy) / (b * b) +
(col - cx) * (col - cx) / (a * a);
inFlag = (v <= 1);
}
}
if (shapeType == cstRect) { // 方框
inFlag =
(fabs(cx - startX) >= fabs(cx - col) && fabs(cy - startY) >=
fabs(cy - row));
}
if (shapeType == cstDiamond) { // 菱形
if (a > 0 && b > 0) {
if (zoomType == csdZoomOut) {
a *= 2;
b *= 2;
}
bool lr1 = (col < (((-a) * (1 - (row - cy) / (b))) + cx));
bool lr2 = (col < (((-a) * (1 - (row - cy) / (-b))) + cx));
bool lr3 = (col < (((a) * (1 - (row - cy) / (-b))) + cx));
bool lr4 = (col < (((a) * (1 - (row - cy) / (b))) + cx));
inFlag = (!lr1 && !lr2 && lr3 && lr4);
}
}
if (shapeType == cstPlus) { // 加號
inFlag =
(fabs(cx - startX) > fabs(cx - col) || fabs(cy - startY) >
fabs(cy - row));
}
*pDst++ = (inFlag != (zoomType == csdZoomOut) ? 0 : 255);
}
return true;
}
演示效果