C++ 中心点和固定大小切小图(代码)

//中心点和固定大小切割图片
cv::Mat CutImage(cv::Mat src, int CenterX, int CenterY, int& DstW, int& DstH, bool Fill, int Color)
{
	cv::Mat dst;

	if (DstW <= 0 || DstH <= 0 || src.rows <= 0 || src.cols <= 0)
	{
		return dst;
	}

	int SrcW = src.cols;
	int SrcH = src.rows;
	int SrcC = src.channels();
	int extendW = DstW / 2;
	int extendH = DstH / 2;
	int roix = CenterX - extendW;
	int roiy = CenterY - extendH;

	if (roix < 0 || roix > SrcW - DstW || roiy < 0 || roiy > SrcH - DstH)
	{
		if (Fill)
		{
			cv::Mat newSrcImg(SrcH + DstH, SrcW + DstW, src.type(), cv::Scalar::all(Color));
			cv::Mat imageRoi = newSrcImg(cv::Rect(extendW, extendH, SrcW, SrcH));
			src.copyTo(imageRoi);

			roix = CenterX;
			roiy = CenterY;

			newSrcImg(cv::Rect(roix, roiy, DstW, DstH)).copyTo(dst);
		}
		else
		{
			int woffset = SrcW - DstW;
			int hoffset = SrcH - DstH;

			if (roix > woffset)
			{
				roix = woffset;
			}
			if (roiy > hoffset)
			{
				roiy = hoffset;
			}
			if (roix < 0)
			{
				roix = 0;
			}
			if (roiy < 0)
			{
				roiy = 0;
			}

			if (woffset < 0)
			{
				DstW = SrcW;
			}
			if (hoffset < 0)
			{
				DstH = SrcH;
			}

			src(cv::Rect(roix, roiy, DstW, DstH)).copyTo(dst);
		}
	}
	else
	{
		src(cv::Rect(roix, roiy, DstW, DstH)).copyTo(dst);
	}

	return dst;
}

你可能感兴趣的:(随心记,opencv,人工智能,计算机视觉)