首先是关于 copyto 的操作郁闷
资源图片 需要 是正方形 或者 宽 大于高经我测试,长宽 大小的情况 还是需要跟背景有相应的一致性。比如如果背景 是长大于宽,则资源文件 也需要长大于宽,反之亦然。正方形的图片,则无此要求,要比背景图片小即可。
- 大图截小图的代码
/// <summary>
///
/// </summary>
/// <param name="src">传入需要操作(抠图)的图片</param>
/// <param name="BackPath">背景图片地址</param>
/// <returns></returns>
public Bitmap GetImageByMat(Mat src, string BackPath)
{
//Mat src = new Mat("D://图片//测试//103.jpg", ImreadModes.Color);
Mat Back = new Mat(BackPath, ImreadModes.Color);
//Mat src = Cv2.ImRead("lenna.png", ImreadModes.GrayScale);
//Mat dst = src.CvtColor(ColorConversionCodes.BGR2GRAY);//新建一个掩码接收变成灰度图的滑稽(灰度处理)
Mat dst1 = src.CvtColor(ColorConversionCodes.BGR2GRAY);//新建一个掩码接收变成灰度图的滑稽(灰度处理)
Mat dst2 = new Mat();
//Cv2.Canny(src, dst, 50, 120);
Cv2.Threshold(dst1, dst1, 168, 255, ThresholdTypes.BinaryInv);//灰度图二值化,高于240的变成黑色,其它白色
int X = (Back.Width - src.Width) / 2;
int Y = (Back.Height-src.Height) / 2;
Rect rect = new Rect(X, Y, dst1.Cols, dst1.Rows);//复制到哪去
Mat pos = new Mat(Back, rect);
//dst2.CopyTo(PosMask);
src.CopyTo(pos, dst1);//掩码黑色的区域不复制
return BitmapConverter.ToBitmap(Back);
//using (new Window("pos", pos))
//using (new Window("Back image", Back))
//using (new Window("dst1 image", dst1))
using (new Window("dst2 image", dst2))
//{
// Cv2.WaitKey();
//}
}
2.我的使用多线程摄像头操作:
// Create class-level accesible variables
VideoCapture capture;
Mat frame;
Bitmap image;
private Thread camera;
bool isCameraRunning = true;
string Backpath;
// Declare required methods
private void CaptureCamera()
{
camera = new Thread(new ThreadStart(CaptureCameraCallback));
camera.IsBackground = true;
camera.Start();
}
private void CaptureCameraCallback()
{
frame = new Mat();
//也可以写成capture = VideoCapture.FromCamera(CaptureDevice.Any);容易出现资源被占用的问题
capture.Open(0);
capture.Set(CaptureProperty.FrameWidth, 800);//设定摄像头图片的大小
capture.Set(CaptureProperty.FrameHeight, 600);
if (capture.IsOpened())
{
while (isCameraRunning)
{
capture.Read(frame);
image = GetImageByMat(frame,Backpath);
if (PicMain.Image != null)
{
PicMain.Image.Dispose();
}
PicMain.Image = image;
}
}
}
public MainForm()
{
InitializeComponent();
PicMain.SizeMode = PictureBoxSizeMode.Zoom;
Backpath = @"./BackImage/back01.jpg";
}
/// <summary>
/// 设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PicSetUp_Click(object sender, EventArgs e)
{
}
其中适用的 mat 转换为 bitmap 方式为:
bitmap= BitmapConverter.ToBitmap(mat)
参考文件:http://www.srcmini.com/60008.html