关于Mat的复制的问题。

   Mat是OpenCV最基本的数据结构,Mat即矩阵(Matrix)的缩写,Mat数据结构主要包含2部分:Header和Pointer。Header中主要包含矩阵的大小,存储方式,存储地址等信息;Pointer中存储指向像素值的指针。关于Mat数据复制:前面说过Mat包括头和数据指针,当使用Mat的构造函数初始化的时候,会将头和数据指针复制(注意:只是指针复制,指针指向的地址不会复制),若要将数据也复制,则必须使用copyTo或clone函数。

  今天写的程序,想讲前后两帧图像相减,分为8*8像素小块,找出运动区域。其中最后的哪行程序,一开始写的pBkImg = pFrImg,只是复制了指针,数据结构没有复制,那么前后两帧从此开始都指向了同一块数据区域,即使后面前景一直跟新,但是前景背景始终指针一样。所以前景背景相减为零。必须要用pBkImg = pFrImg.clone();才行。引以为戒。

Mat CSmoke::operator()(const Mat Src, const int& index)
{
if (index == 0)
{
m_Width = Src.cols;
m_Height = Src.rows;
Src.copyTo(rgbimg);
//cvtColor(rgbimg, pFrImg, CV_BGR2GRAY);
cvtColor(rgbimg, pBkImg, CV_BGR2GRAY);
Threshold_Img = Mat(cvSize(m_Width, m_Height), CV_8U, 3);
}
else
{
Src.copyTo(rgbimg);
rgbimg.copyTo(show);
cvtColor(rgbimg, pFrImg, CV_BGR2GRAY);
absdiff(pFrImg, pBkImg, Threshold_Img);
//Threshold_Img = abs(pFrImg - pBkImg);//这样求差也行
imshow("pFrImg", pFrImg);
imshow("pBkImg", pBkImg);
waitKey(1);
for (int j = 0; j < Src.rows; j = j + 8)
{
for (int i = 0; i < Src.cols; i= i + 8)
{
int count = 0;
Mat piece = Threshold_Img(Rect(i, j, 8, 8)).clone();
for (int k = 0; k < 8; k++)
{
uchar* pp = piece.ptr<uchar>(k);
for (int m = 0; m < 8; m++)
{
count += pp[m];
}
}
cout << count << endl;
if (count >= 200)
{

rectangle(show, Point(i, j), Point(i + 8, j + 8), Scalar(0, 0, 255));

}
}
}
pBkImg = pFrImg.clone();
}
return show;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值