c# 调用 c++ dll 使用Opencv 来进行动态 物体识别

基本原理是基于摄像头采集到的图像进行图像处理,来识别动态物体。
首先呢,得先获取到摄像头采集到的图像
//打开摄像头
int _stdcall OpenCamera()
{
capture.open(0);
bgsubtractor = createBackgroundSubtractorMOG2(500, 36, false);
if (!capture.isOpened())
{
return 0;
}
else
{
return 1;
}
}

int _stdcall getMat(Mat* mt)
{
//VideoCapture capture(0);//从摄像头读入视频 默认列表从第一个摄像头开始读

if (!capture.isOpened())
{
	return 0;
}
else
{
	Mat edges; //定义一个Mat变量,用于存储每一帧的图像

	capture >> edges;  //读取当前帧    

	size_t with = edges.rows;//宽
	size_t height = edges.cols;//高
	size_t proportion = 60;
	
	*mt = edges(Range(proportion, with - proportion), Range(0, height));
					 
    //cvtColor(*mt, edges, CV_BGR2GRAY);//彩色转换成灰度
	//blur(edges, edges, Size(7, 7));//模糊化
	//Canny(edges, edges, 0, 30, 3);//边缘化

	return 1;
}
至此我们就已经拿到了摄像头所拍摄的图像,具体需要什么样的图像数据,可以根据项目自行修改。然后我们需要对所获得的图像进行处理在分析是否又物体在动,而opencv则为我们提供了一个函数 bgsubtractor.高斯混合模型背景建模(BackgroundSubtractorMOG2)
这个也是基于帧差法来处理判断的。

//将转化的图像转成bmp格式数据流传递给c#
int _stdcall getVariedByte(uchar *bmp, size_t& bsize, uchar *grayscale, size_t& gsize)
{
vector bBuf;
vector gBuf;
Mat bmt;
Mat gmt;

if (getMat(&bmt) == 1)
{
	imencode(".bmp", bmt, bBuf);
	bsize = bBuf.size();
	for each (uchar var in bBuf)
	{
		*bmp = var;
		bmp++;
	}

	bgsubtractor->apply(bmt, gmt, 0.1f);

	imencode(".bmp", gmt, gBuf);

	gsize = gBuf.size();

	for each (uchar var in gBuf)
	{
		*grayscale = var;
		grayscale++;
	}
	return 1;
}
else
{
	return 0;
}

}

而c#中直接将其转化image格式即可:
public byte[] ptrData = new byte[2048 * 2048 * 3];
public bool isOpen = false;
private void button1_Click(object sender, EventArgs e)
{

        if (!isOpen)
        {
            if (OpenCamera() == 1)
            {
                isOpen = true;
            }
        }

        ulong size = new ulong();

        if (getBmpByte(ref ptrData[0], out size) == 1)
        {
            this.label1.Text = "数据数量:" + size;
            this.pictureBox1.Image = Image.FromStream(new MemoryStream(ptrData, 0, (int)size));
            Array.Clear(ptrData, 0, ptrData.Length);
        }
        else
        {
            isOpen = false;
        }

    }

你可能感兴趣的:(c#,硬件)