cvx可以指定dnfsp点初始化点吗

后使用快捷导航没有帐号?
只需一步,快速开始
交易诚信度0
主题帖子威望
新手上路, 积分 0, 距离下一级还需 1 积分
交易诚信度0
今天 白天试了下 稳定下来后 基本是560-580瓦。今天西安37度
[ 本帖最后由 tingyuxuan 于
16:38 编辑 ]
交易诚信度0
主题帖子威望
交易诚信度0
提示: 作者被禁止或删除 内容自动屏蔽
交易诚信度0
主题帖子威望
初级会员, 积分 2, 距离下一级还需 3 积分
交易诚信度0
LZ 的CVX是制冷功率比抽湿功率高??
交易诚信度0
主题帖子威望
初级会员, 积分 1, 距离下一级还需 4 积分
交易诚信度0
这贴才看到,顶楼主,我也买了72CVX,这个夏天柜机的使用时间比挂机高,确实比较舒服,温度稳定,就是用的是空气开关,没法量功耗,现在有数了。卧室里由于上当买了垃圾家具,甲醛超标,不敢关窗,一直窗户大开,35CVX只能设定略低于室温,当略带凉意的风扇用,不过有观察到功率110+W。除非睡觉,否则都在厅里用柜机。
交易诚信度0
主题帖子威望
初级会员, 积分 3, 距离下一级还需 2 积分
交易诚信度0
72cvx管子是5米的吗?
金钱135228
交易诚信度0
主题帖子威望
超级会员, 积分 167, 距离下一级还需 33 积分
交易诚信度0
最近有一贴三菱电机的测下来是500多W。这样看下来,低频涡旋还是可行的。
我为人人~~~天下大爱~~~~
家电以性价比为首选目标~~~~
交易诚信度0
主题帖子威望
新手上路, 积分 0, 距离下一级还需 1 积分
交易诚信度0
三菱电机是60机,日立是72机,日立最低350W。电机最低400-500W。
交易诚信度0
主题帖子威望
特级会员, 积分 54, 距离下一级还需 46 积分
交易诚信度0
回复 37# jesson 的帖子
你这根本是断章取义。
交易诚信度0
主题帖子威望
初级会员, 积分 2, 距离下一级还需 3 积分
交易诚信度0
72CVX待机功率不知道是多少?
交易诚信度0
主题帖子威望
交易诚信度0
提示: 作者被禁止或删除 内容自动屏蔽
金钱135228
交易诚信度0
主题帖子威望
超级会员, 积分 167, 距离下一级还需 33 积分
交易诚信度0
原帖由 家电盲流 于
07:16 发表
你这根本是断章取义。
就拿事实来讲话吧。
toshibasony 在我的帖子上传了测试三菱电机柜机的情况和图品,
三菱电机SXE60。。。
设置25度,风量高,方向上,摆动开。。。
室外机温度传感器附近32.7度,室内初始温度28.8,温度曲线测量点在客厅与餐厅之间的间隔柜上。。。
Image00000.jpg (205.16 KB, 下载次数: 23)
18:35 上传
我为人人~~~天下大爱~~~~
家电以性价比为首选目标~~~~
交易诚信度0
主题帖子威望
新手上路, 积分 0, 距离下一级还需 1 积分
交易诚信度0
3匹机器接16A插头的全中国到处都是
72CVX最大不过3200W,16A一点问题没有
[ 本帖最后由 marmot32 于
09:23 编辑 ]
交易诚信度0
主题帖子威望
新手上路, 积分 0, 距离下一级还需 1 积分
交易诚信度0
柜机安装工也都会带个插头卖给你
2K多W的变频空调非得接空开?
2KW的电暖器都还接着10A的插头出厂呢,这可是实实在在2KW长时间开的
交易诚信度0
主题帖子威望
交易诚信度0
提示: 作者被禁止或删除 内容自动屏蔽
交易诚信度0
主题帖子威望
新手上路, 积分 0, 距离下一级还需 1 积分
交易诚信度0
回复 1# tingyuxuan 的帖子
请问楼主16A的插头如何插进万方四代?[s:31]
万方四代可是10A的插口啊!
Powered by后使用快捷导航没有帐号?
只需一步,快速开始
交易诚信度1
主题帖子威望
中级会员, 积分 6, 距离下一级还需 14 积分
交易诚信度1
马上注册 家电论坛,众多有奖活动等你来参与!
才可以下载或查看,没有帐号?
离开坛子一月,周一下午休息正好搞下高温环境下的测试。
测试环境:
日下午,室外天气晴,温度35度
房间15平方,高2.7m,朝南大飘窗,无西晒。房内大衣橱,电脑桌,1.8m床,梳妆台,房内一人.
空调设置:温度23,风量强
室内温度欧西亚座机,出风口温度欧西亚探头,座机放于床头柜上,座机温度一般比探头显示高0.5度。
室内温度出风口温度室内湿度内机显示初始32.7N/A60%15分钟31.116.751%2930分钟29.913.242%2845分钟28.811.640%2760分钟27.610.640%27
总结,对于出风口温差还是满意的,基本保持了以前测试的水平,最低依然可以达到10.6,上一次30度室外温度时最低也就10.4.
变频的降温速度还是偏慢,不过运行30-45时,人体基本已经很凉爽了,虽然室内还是28左右,但是由于室外温差和湿度的降低,体感非常舒适了。
运行一小时后,出风口温度开始上升,空调应该是开始降低功率慢慢将室温降低到设定温度。(估计最后也就是26-27了)
对于35cvx在35度室外温度的表现还比较满意,上到40度确实有点吃力了。
金钱453609
交易诚信度0
主题帖子威望
交易诚信度0
交易区新帖推荐
感谢楼主的测试。感觉还是很慢,1小时才降下来5度,实际中无法满足一些应用,比如中午回来午休。所谓的舒服,也就是比较而言,跟35度比较,并不是通常意义上的20-25度的舒适区间。
这机器直冷偏软偏慢无疑了。
抵制日货,人人有责!要铁骨不要铁嘴!航母直接搁浅钓鱼岛!
交易诚信度1
主题帖子威望
中级会员, 积分 6, 距离下一级还需 14 积分
交易诚信度1
被迫的要求好高啊,20-25度才是舒适区间?要冻死人的啊。而且不符合国家标准啊,哈哈。
室外温度35度的时候,被迫的空调依然打到25度以下么?温差10度以上人体反而不舒服了吧?
交易诚信度0
主题帖子威望
中级会员, 积分 13, 距离下一级还需 7 积分
交易诚信度0
我早上测的大金的EMAX35: FTXS35HV2C, 室内初试32度,马上测出风口温度,很快就变成9.4度了,没有继续等待进一步下降。我这时测室内机上面进风口温度,是30~31C之间。
另外我还是用的风量的4档(1~5档,5档风量最强),我的外机朝南太阳直晒,感觉你的这款CVX制冷还是偏软一点。
当然我的机器是变频2级能效的,而且最低功率比你的高,但是强力制冷感觉更“硬”一些。
交易诚信度1
主题帖子威望
中级会员, 积分 6, 距离下一级还需 14 积分
交易诚信度1
恩,cvx是偏软那。
温度下降慢我觉得和我的温度计也有关,扔到冰箱里也要慢慢降低,无法实时显示。所以最低值可以参考下。
追求能耗的结果呀。夏天还是以前用定频机来的爽,哈哈。不过睡觉的时候还是变频舒服
金钱654138
交易诚信度0
主题帖子威望
超级会员, 积分 112, 距离下一级还需 88 积分
交易诚信度0
降温真够慢的
枪手是不麻腿的座便
交易诚信度0
主题帖子威望
初级会员, 积分 4, 距离下一级还需 1 积分
交易诚信度0
估计CVX为了追求能效比啊
金钱733378
交易诚信度6
主题帖子威望
交易诚信度6
看来,所谓压力门纯粹是杞人忧天了。[s:14]
马甲藏好,枪手滚粗!
靠忽悠网友赢取私利者,天诛地灭!
金钱337442
交易诚信度0
主题帖子威望
高级会员, 积分 40, 距离下一级还需 10 积分
交易诚信度0
室外35度对空调来说已不算高温了!
本人性别:男
交易诚信度0
主题帖子威望
中级会员, 积分 15, 距离下一级还需 5 积分
交易诚信度0
买的人说舒服,可是没买的人非要说不舒服,一开始以为是反石头,搞了半天半还是反CVX,CVX的帖子里面总能见到三巨头的身影,空调是让人舒服的,不是让人冷的,在单位吹着小金豆才想起BVX的好,三巨头你好,三巨头再见!
金钱103314
交易诚信度0
主题帖子威望
高级会员, 积分 27, 距离下一级还需 23 积分
交易诚信度0
我是挺CVX的,好不好,用过才知道
金钱654138
交易诚信度0
主题帖子威望
超级会员, 积分 112, 距离下一级还需 88 积分
交易诚信度0
楼主实际测试,1小时才能降到预设的正常使用温度。
请问,这一小时怎么舒适呢?
枪手是不麻腿的座便
交易诚信度0
主题帖子威望
初级会员, 积分 1, 距离下一级还需 4 积分
交易诚信度0
希望能改善一下制冷效果,我的房间朝西南,主卧西晒,如果制冷效果不好,还真不敢买
交易诚信度1
主题帖子威望
中级会员, 积分 6, 距离下一级还需 14 积分
交易诚信度1
大家为什么不探讨下降温慢的原因呢?风量一定的情况下,是否就是出风口和进风口温差太小呢?
我感觉16-17度的温差似乎还可以了,大家觉得慢的,自己的空调温差有多少呢?
交易诚信度0
主题帖子威望
初级会员, 积分 4, 距离下一级还需 1 积分
交易诚信度0
[s:148]原帖由 nanpa365 于
19:25 发表
买的人说舒服,可是没买的人非要说不舒服,一开始以为是反石头,搞了半天半还是反CVX,CVX的帖子里面总能见到三巨头的身影,空调是让人舒服的,不是让人冷的,在单位吹着小金豆才想起BVX的好,三巨头你好,三巨头再见 ...
三巨头。。[s:148] [s:148] [s:148]
优秀斑竹奖
优秀斑竹奖
Powered by1485人阅读
  本文通过opencv来实现一种前景检测算法——GMM,算法采用的思想来自论文[1][2][4]。在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯的个数可以自适应。然后在测试阶段,对新来的像素进行GMM匹配,如果该像素值能够匹配其中一个高斯,则认为是背景,否则认为是前景。由于整个过程GMM模型在不断更新学习中,所以对动态背景有一定的鲁棒性。最后通过对一个有树枝摇摆的动态背景进行前景检测,取得了较好的效果。
关键字:GMM,opencv,前景检测
  前景检测主要分为帧差法,平均背景法,光流法,前景建模法,背景非参数估计,背景建模法等。而本文要实现的方法属于背景建模法中的一种——GMM,也称混合高斯模型。
  混合高斯模型最早在计算机视觉中的应用是Stauffer et al.[1],作者将其用来做前景检测,主要是用于视频监控领域,这个系统和稳定且有自学能力,能在户外环境跑16个多月。KaewTraKulPong et al.[2]将GMM的训练过程做了改进,将训练过程分为2步进行,前L帧采用EM算法进行权值,均值,方差更新,后面的过程就采用[1]中的方法进行更新,取得了更好的检测效果。Zivkovic et al.在[3]中对GMM理论做了全面的论述,使得GMM理论的使用不仅金限于计算机视觉领域。并且该作者在[4]将该理论进一步具体到背景减图的前景检测中来,即加入了参数估计的先验知识,取得了很好的效果和稳定性。
  最近几年陆续有学者对GMM的背景见图中的应用做了更深一步的研究,其代表性贡献见论文[5][6]。
& 实现过程
  本文中主要是根据[2][4]中提出的算法,采用其中的更新方差来根性模型中的3个参数,最后结合用opencv基本底层函数实现该算法。其主要过程如下:
首先将每个高斯的均值,方差,权值都设置为0,即初始化个模型矩阵参数。采用视频中的T帧用来训练GMM模型。对每一个像素而言,建立其模型个数最大GMM_MAX_COMPONT个高斯的GMM模型。当第一个像素来,单独为其在程序中设置好其固定的初始均值,方差,并且权值设置为1。非第一帧训练过程中,当后面来的像素值时,与前面已有的高斯的均值比较,如果该像素点的值与其模型均值差在3倍的方差内,则任务属于该高斯。此时用如下方程进行更新:
  4. 当到达训练的帧数T后,进行不同像素点GMM个数自适应的选择。首先用权值除以方差对各个高斯进行从大到小排序,然后选取最前面B个高斯,使
  这样就可以很好的消除训练过程中的噪声点。
  5. 在测试阶段,对新来像素点的值与B个高斯中的每一个均值进行比较,如果其差值在2倍的方差之间的话,则认为是背景,否则认为是前景。并且只要其中有一个高斯分量满足该条件就认为是前景。前景赋值为255,背景赋值为0。这样就形成了一副前景二值图。
  6. 由于前景二值图中含有很多噪声,所以采用了形态学的开操作将噪声缩减到0,紧接着用闭操作重建由于开操作丢失的边缘部分的信息。消除了不连通的小噪声点。
  上面是该算法实现的大概流程,但是当我们在具体编程时,还是有很多细节的地方需要注意,比如有些参数值的选择。在这里,经过试验将一些常用的参数值声明如下:
3个参数的值的更新方差中,取其中的学习率为0.005。也就是说T等于200。定义每个像素的最大混合高斯个数取7。取视频的前200帧进行训练。取Cf为0.3。即满足权值大于0.7的个数为自适应高斯的个数B。训练过程中,需要新建立一个高斯时,其权值取值设为与学习率大小值相等,即0.005。训练过程中,需要新建立一个高斯时,取该高斯的均值为该输入像素值大小本身。方差为15。训练过程中,需要新建立一个高斯时,取该高斯的方差15。
&& 程序流程框图
  该工程的流程框图如下图所示:
                                        
                          
                                     &&           
                                      试验结果
  本次试验的数据为摇摆的树枝作为背景,Waving Trees,其来源网址为:
由于该数据是286张bmp格式的图片,所以用的前200张图片来作为GMM参数训练,后186张作为测试。训练的过程中树枝被很大幅度的摆动,测试过程中有行人走动,该行人是需要迁就检测的部分。
  下图为训练过程中动态背景截图
  由上图可以看出,树枝在不断摇摆,可见其背景是动态的。
  没有形态学处理的结果如下:
&&&&&下图是有简单形态学的试验结果:
&&&&& (上面2幅图的左边为测试原始图片,右图为检测效果图)
  通过本次试验,不仅学习到了GMM的相关理论知识,以及背景减图法在前景检测中的应用。更重要的时,对opencv在计算机视觉中的使用更进一步的熟悉了。另外对于目标检测的难点有了更深一层的理解。
Stauffer, C. and W. E. L. Grimson (1999).
Adaptive background mixture models for real-time tracking, IEEE.KaewTraKulPong, P. and R. Bowden (2001).
An improved adaptive background mixture model for real-time tracking with shadow detection.Zivkovic, Z. and F. van der Heijden (2004). &Recursive unsupervised learning of finite mixture models.&Pattern Analysis and Machine Intelligence, IEEE Transactions on26(5): 651-656.Zivkovic, Z. and F. van der Heijden (2006). &Efficient adaptive density estimation per image pixel for the task of background subtraction.&Pattern recognition letters27(7): 773-780.Bouzerdoum, A., A. Beghdadi, et al. (2010). &On the analysis of background subtraction techniques using Gaussian mixture models.&Lin, H. H., J. H. Chuang, et al. (2011). &Regularized background adaptation: a novel learning rate control scheme for Gaussian mixture modeling.&Image Processing, IEEE Transactions on20(3):
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 后续改进
  需要改进的地方:
  1. 程序运行的速度太慢,很多参数都是浮点数,每个像素都要建立一个gmm,gmm个数本身比较多,所以训练过程中速度比较慢,代码需要优化。
  2. 最后生成的前景图需要用连通域处理算法进行修整,即需要形态学操作,然后找出连通域大小满足要求的轮廓,用多边形拟合来进行处理。这种算法在《learning opencv》一书中有提到。后续有时间加入该算法,效果会好很多的。
                                    & 附录:工程代码
//gmm.cpp : 定义控制台应用程序的入口点。
2 #include &stdafx.h&
3 #include &cv.h&
4 #include &highgui.h&
5 #include &opencv2/imgproc/imgproc.hpp&
6 #include &opencv2/core/core.hpp&
7 #include &opencv2/highgui/highgui.hpp&
8 #include &stdio.h&
9 #include &iostream&
11 using namespace
12 using namespace
14 //定义gmm模型用到的变量
15 #define GMM_MAX_COMPONT 6
16 #define GMM_LEARN_ALPHA 0.005
//该学习率越大的话,学习速度太快,效果不好
17 #define GMM_THRESHOD_SUMW 0.7
//如果取值太大了的话,则更多树的部分都被检测出来了
18 #define END_FRAME 200
20 bool pause=false;
22 Mat w[GMM_MAX_COMPONT];
23 Mat u[GMM_MAX_COMPONT];
24 Mat sigma[GMM_MAX_COMPONT];
25 Mat fit_num,gmask,
26 vector&Mat& output_m;
27 Mat output_
29 float temp_w,temp_
30 unsigned char temp_u;
31 int i=-<span style="color:#;
34 //For connected components:
35 int CVCONTOUR_APPROX_LEVEL = <span style="color:#;
// Approx.threshold - the bigger it is, the simpler is the boundary
36 int CVCLOSE_ITR = <span style="color:#;
38 //Just some convienience macros
39 #define CV_CVX_WHITE
CV_RGB(0xff,0xff,0xff)
40 #define CV_CVX_BLACK
CV_RGB(0x00,0x00,0x00)
42 //gmm整体初始化函数声明
43 void gmm_init(Mat img);
45 //gmm第一帧初始化函数声明
46 void gmm_first_frame(Mat img);
48 //gmm训练过程函数声明
49 void gmm_train(Mat img);
51 //对输入图像每个像素gmm选择合适的个数函数声明
52 void gmm_fit_num(Mat img);
54 //gmm测试函数的实现
55 void gmm_test(Mat img);
57 //连通域去噪函数声明
58 void find_connected_components(Mat img);
59 //void cvconnectedComponents(IplImage *mask, int poly1_hull0, float perimScale, int *num, CvRect *bbs, CvPoint *centers);
61 int main(int argc, const char* argv[])
Mat img,img_
char str_num[<span style="color:#];
char *str_//why does this definition not work?
String str=&WavingTrees/b00&;//string,the 's' can be a captial or lower-caseletters
/****read the first image,and reset the array w,u,sigma****/
img=imread(&WavingTrees/b00000.bmp&);
if(img.empty())
return -<span style="color:#;
output_img=Mat::zeros(img.size(),img.type());
cvtColor(img,img_gray,CV_BGR2GRAY);//covert the colorful image to the corresponding gray-level image
/****initialization the three parameters ****/
gmm_init(img_gray);
fit_num=Mat(img.size(),CV_8UC1,-<span style="color:#);//初始化为1
gmask=Mat(img.size(),CV_8UC1,-<span style="color:#);
foreground=img.clone();
split(img,output_m);
output_m[<span style="color:#]=Mat::zeros(img.size(),output_m[<span style="color:#].type());
output_m[<span style="color:#]=Mat::zeros(img.size(),output_m[<span style="color:#].type());
output_m[<span style="color:#]=Mat::zeros(img.size(),output_m[<span style="color:#].type());
namedWindow(&src&,WINDOW_AUTOSIZE);
namedWindow(&gmask&,WINDOW_AUTOSIZE);
//在定义视频输出对象时,文件名一定后面要加后缀,比如这里的.avi,否则是输出不了视频的!并且这里只能是avi&#26684;式的,当参数为('P','I','M','1')时
VideoWriter output_src(&src.avi&,CV_FOURCC('P','I','M','<span style="color:#'),<span style="color:#,Size(<span style="color:#0,<span style="color:#0),<span style="color:#);//c&#43;&#43;版本的opencv用Size函数即可,c版本的用cvSize()函数
//VideoWriter output_src(&src.avi&,CV_FOURCC('M','J','P','G'),5,Size(160,120),1);//c&#43;&#43;版本的opencv用Size函数即可,c版本的用cvSize()函数
VideoWriter output_dst(&dst.avi&,CV_FOURCC('P','I','M','<span style="color:#'),<span style="color:#,Size(<span style="color:#0,<span style="color:#0),<span style="color:#);//这样输出的是3个通道的数据
while(<span style="color:#)
if(!pause)
<span style="color:#0
<span style="color:#1
/****read image from WavingTrees****/
<span style="color:#2
i&#43;&#43;;
<span style="color:#3
_itoa_s(i,str_num,<span style="color:#);//the latest name is _itoa_s or _itoa,not the itoa,although iota can be used,deprecated
<span style="color:#4
if(i&<span style="color:#)
<span style="color:#5
str&#43;=&<span style="color:#&;
<span style="color:#6
else if(i&<span style="color:#0)
<span style="color:#7
str&#43;=&<span style="color:#&;
<span style="color:#8
else if(i&<span style="color:#5)//we used the first 285 frames to learn the gmm model
<span style="color:#9
i=-<span style="color:#;
<span style="color:#0
str&#43;=str_
<span style="color:#1
str&#43;=&.bmp&;
<span style="color:#2
<span style="color:#3
img=imread(str);
<span style="color:#4
if(img.empty())
<span style="color:#5
<span style="color:#6
str=&WavingTrees/b00&;//after read,
<span style="color:#7
<span style="color:#8
cvtColor(img,img_gray,CV_BGR2GRAY);//covert the colorful image to the corresponding gray-level image
<span style="color:#9
<span style="color:#0
/****when it is the first frame,set the default parameter****/
<span style="color:#1
if(<span style="color:#==i)
<span style="color:#2
<span style="color:#3
gmm_first_frame(img_gray);
<span style="color:#4
<span style="color:#5
<span style="color:#6
//the train of gmm phase
<span style="color:#7
//if(1&i&&i&5&&i!=3)//由此可知当i大于等于3以后,就会一直出现错误,且错误在内部排序的部分
<span style="color:#8
if(<span style="color:#&i&END_FRAME)
<span style="color:#9
<span style="color:#0
gmm_train(img_gray);
<span style="color:#1
}//end the train phase
<span style="color:#2
<span style="color:#3
<span style="color:#4
/****chose the fitting number of component in gmm****/
<span style="color:#5
if(END_FRAME==i)
<span style="color:#6
<span style="color:#7
gmm_fit_num(img_gray);
<span style="color:#8
cout&&fit_num&&//其输出&#20540;有4个高斯的,但也有0个高斯的,why?照理说不可能的啊!
<span style="color:#9
<span style="color:#0
<span style="color:#1
/****start the test phase****/
<span style="color:#2
if(i&=END_FRAME)
<span style="color:#3
<span style="color:#4
output_src&&
<span style="color:#5
gmm_test(img_gray);
<span style="color:#6
find_connected_components(img_gray);
<span style="color:#7
<span style="color:#8
output_m[<span style="color:#]=gmask.clone();
<span style="color:#9
output_m[<span style="color:#]=gmask.clone();
<span style="color:#0
output_m[<span style="color:#]=gmask.clone();
<span style="color:#1
<span style="color:#2
merge(output_m,output_img);
<span style="color:#3
output_dst&&output_
<span style="color:#4
<span style="color:#5
if(<span style="color:#5==i)
<span style="color:#6
<span style="color:#7
return <span style="color:#;
<span style="color:#8
<span style="color:#9
imshow(&src&,img);
<span style="color:#0
imshow(&gmask&,gmask);
<span style="color:#1
<span style="color:#2
<span style="color:#3
char c=(char)waitKey(<span style="color:#);
<span style="color:#4
if(c==<span style="color:#)//if press the ESC key,the exit the proggram
<span style="color:#5
<span style="color:#6
if(c==' ')
<span style="color:#7
pause=~//if use '~',then the pause key cannot work,why?
<span style="color:#8
<span style="color:#9
<span style="color:#0
return <span style="color:#;
<span style="color:#1 }
<span style="color:#2
<span style="color:#3
<span style="color:#4 //gmm初始化函数实现
<span style="color:#5 void gmm_init(Mat img)
<span style="color:#6 {
<span style="color:#7
/****initialization the three parameters ****/
<span style="color:#8
for(int j=<span style="color:#;j&GMM_MAX_COMPONT;j&#43;&#43;)
<span style="color:#9
<span style="color:#0
w[j]=Mat(img.size(),CV_32FC1,<span style="color:#.0);//CV_32FC1本身体现了正负符号
<span style="color:#1
u[j]=Mat(img.size(),CV_8UC1,-<span style="color:#);//为什么这里赋&#20540;为0时,后面的就一直出错?暂时还不知道原因,先赋&#20540;-1,其实内部存储的也是0
<span style="color:#2
sigma[j]=Mat(img.size(),CV_32FC1,<span style="color:#.0);//float类型
<span style="color:#3
<span style="color:#4
<span style="color:#5
//为什么一下语句不能放在这个函数里面呢
<span style="color:#6 //
output_m[0]=Mat(img.size(),CV_8UC1,0);
<span style="color:#7 //
output_m[1]=Mat(img.size(),CV_8UC1,0);
<span style="color:#8 //
output_m[2]=Mat(img.size(),CV_8UC1,0);
<span style="color:#9 }
<span style="color:#0
<span style="color:#1
<span style="color:#2 //gmm第一帧初始化函数实现
<span style="color:#3 void gmm_first_frame(Mat img)
<span style="color:#4 {
<span style="color:#5
for(int m=<span style="color:#;m&img.m&#43;&#43;)
<span style="color:#6
for(int n=<span style="color:#;n&img.n&#43;&#43;)
<span style="color:#7
<span style="color:#8
w[<span style="color:#].at&float&(m,n)=<span style="color:#.0;
<span style="color:#9
<span style="color:#0
//if the pixvel is gray-clever,then we should use unsigned char,not the unsigned int
<span style="color:#1
u[<span style="color:#].at&unsigned char&(m,n)=img.at&unsigned char&(m,n);// 一定要注意其类型转换,否则会得不得预期的结果
<span style="color:#2
sigma[<span style="color:#].at&float&(m,n)=<span style="color:#.0;//opencv 自带的gmm代码中用的是15.0
<span style="color:#3
<span style="color:#4
for(int k=<span style="color:#;k&GMM_MAX_COMPONT;k&#43;&#43;)
<span style="color:#5
<span style="color:#6
/****when assigment this,we must be very carefully****/
<span style="color:#7
w[k].at&float&(m,n)=<span style="color:#.0;
<span style="color:#8
u[k].at&unsigned char&(m,n)=-<span style="color:#;
<span style="color:#9
sigma[k].at&float&(m,n)=<span style="color:#.0;//防止后面排序时有分母为0的情况
<span style="color:#0
<span style="color:#1
<span style="color:#2 }
<span style="color:#3
<span style="color:#4
<span style="color:#5 //gmm训练过程函数实现
<span style="color:#6 void gmm_train(Mat img)
<span style="color:#7 {
<span style="color:#8
for(int m=<span style="color:#;m&img.m&#43;&#43;)
<span style="color:#9
for(int n=<span style="color:#;n&img.n&#43;&#43;)
<span style="color:#0
<span style="color:#1
int k=<span style="color:#;
<span style="color:#2
int nfit=<span style="color:#;
<span style="color:#3
for(;k&GMM_MAX_COMPONT;k&#43;&#43;)
<span style="color:#4
<span style="color:#5
if(w[k].at&float&(m,n)!=0)//只有在权&#20540;不为0的情况下才进行比较
<span style="color:#6
<span style="color:#7
int delam=abs(img.at&unsigned char&(m,n)-u[k].at&unsigned char&(m,n));//防止溢出
<span style="color:#8
long dis=delam*
<span style="color:#9
if(dis&<span style="color:#.0*sigma[k].at&float&(m,n))//the present pixpel is fit the component
<span style="color:#0
<span style="color:#1
/****update the weight****/
<span style="color:#2
w[k].at&float&(m,n)=w[k].at&float&(m,n)&#43;GMM_LEARN_ALPHA*(<span style="color:#-w[k].at&float&(m,n));
<span style="color:#3
<span style="color:#4
/****update the average****/
<span style="color:#5
u[k].at&unsigned char&(m,n)=u[k].at&unsigned char&(m,n)&#43;(GMM_LEARN_ALPHA/w[k].at&float&(m,n))*
<span style="color:#6
<span style="color:#7
/****update the variance****/
<span style="color:#8
sigma[k].at&float&(m,n)=sigma[k].at&float&(m,n)&#43;(GMM_LEARN_ALPHA/w[k].at&float&(m,n))*(dis-sigma[k].at&float&(m,n));
<span style="color:#9
<span style="color:#0
<span style="color:#1
<span style="color:#2
<span style="color:#3
w[k].at&float&(m,n)=w[k].at&float&(m,n)&#43;GMM_LEARN_ALPHA*(<span style="color:#-w[k].at&float&(m,n));
<span style="color:#4
nfit&#43;&#43;;
<span style="color:#5
<span style="color:#6
<span style="color:#7
<span style="color:#8
<span style="color:#9
////训练过程加速算法
<span style="color:#0
//for(int bb=k&#43;1;bb&GMM_MAX_COMPONT;bb&#43;&#43;)
<span style="color:#1
<span style="color:#2
w[bb].at&float&(m,n)=w[bb].at&float&(m,n)&#43;GMM_LEARN_ALPHA*(0-w[bb].at&float&(m,n));
<span style="color:#3
nfit&#43;&#43;;
<span style="color:#4
<span style="color:#5
<span style="color:#6
//对gmm各个高斯进行排序,从大到小排序,排序依据为w/sigma
<span style="color:#7
for(int kk=<span style="color:#;kk&GMM_MAX_COMPONT;kk&#43;&#43;)
<span style="color:#8
<span style="color:#9
for(int rr=rr&GMM_MAX_COMPONT;rr&#43;&#43;)
<span style="color:#0
<span style="color:#1
//怎样才能做到gmm结构体整体排序呢?
<span style="color:#2
if(w[rr].at&float&(m,n)/sigma[rr].at&float&(m,n)&w[kk].at&float&(m,n)/sigma[kk].at&float&(m,n))
<span style="color:#3
<span style="color:#4
//权&#20540;交换
<span style="color:#5
temp_w=w[rr].at&float&(m,n);
<span style="color:#6
w[rr].at&float&(m,n)=w[kk].at&float&(m,n);
<span style="color:#7
w[kk].at&float&(m,n)=temp_w;
<span style="color:#8
<span style="color:#9
//均&#20540;交换
<span style="color:#0
temp_u=u[rr].at&unsigned char&(m,n);
<span style="color:#1
u[rr].at&unsigned char&(m,n)=u[kk].at&unsigned char&(m,n);
<span style="color:#2
u[kk].at&unsigned char&(m,n)=temp_u;
<span style="color:#3
<span style="color:#4
//方差交换
<span style="color:#5
temp_sigma=sigma[rr].at&float&(m,n);
<span style="color:#6
sigma[rr].at&float&(m,n)=sigma[kk].at&float&(m,n);
<span style="color:#7
sigma[kk].at&float&(m,n)=temp_
<span style="color:#8
<span style="color:#9
<span style="color:#0
<span style="color:#1
<span style="color:#2
//****如果没有满足条件的高斯,则重新开始算一个高斯分布****/
<span style="color:#3
if(nfit==GMM_MAX_COMPONT&&<span style="color:#==w[GMM_MAX_COMPONT-<span style="color:#].at&float&(m,n))//if there is no exit component fit,then start a new componen
<span style="color:#4
<span style="color:#5
//不能写为for(int h=0;h&MAX_GMM_COMPONT&&((0==w[h].at&float&(m,n)));h&#43;&#43;),因为这样明显h不会每次都加1
<span style="color:#6
for(int h=<span style="color:#;h&GMM_MAX_COMPONT;h&#43;&#43;)
<span style="color:#7
<span style="color:#8
if((<span style="color:#==w[h].at&float&(m,n)))
<span style="color:#9
<span style="color:#0
w[h].at&float&(m,n)=GMM_LEARN_ALPHA;//按照论文的参数来的
<span style="color:#1
u[h].at&unsigned char&(m,n)=(unsigned char)img.at&unsigned char&(m,n);
<span style="color:#2
sigma[h].at&float&(m,n)=<span style="color:#.0;//the opencv library code is 15.0
<span style="color:#3
for(int q=<span style="color:#;q&GMM_MAX_COMPONT&&q!=h;q&#43;&#43;)
<span style="color:#4
<span style="color:#5
/****update the other unfit's weight,u and sigma remain unchanged****/
<span style="color:#6
w[q].at&float&(m,n)*=<span style="color:#-GMM_LEARN_ALPHA;//normalization the weight,let they sum to 1
<span style="color:#7
<span style="color:#8
break;//找到第一个权&#20540;不为0的即可
<span style="color:#9
<span style="color:#0
<span style="color:#1
<span style="color:#2
//如果GMM_MAX_COMPONT都曾经赋&#20540;过,则用新来的高斯代替权&#20540;最弱的高斯,权&#20540;不变,只更新均&#20540;和方差
<span style="color:#3
else if(nfit==GMM_MAX_COMPONT&&w[GMM_MAX_COMPONT-<span style="color:#].at&float&(m,n)!=<span style="color:#)
<span style="color:#4
<span style="color:#5
u[GMM_MAX_COMPONT-<span style="color:#].at&unsigned char&(m,n)=(unsigned char)img.at&unsigned char&(m,n);
<span style="color:#6
sigma[GMM_MAX_COMPONT-<span style="color:#].at&float&(m,n)=<span style="color:#.0;//the opencv library code is 15.0
<span style="color:#7
<span style="color:#8
<span style="color:#9
<span style="color:#0
<span style="color:#1 }//end the train phase
<span style="color:#2
<span style="color:#3
<span style="color:#4 //对输入图像每个像素gmm选择合适的个数
<span style="color:#5 void gmm_fit_num(Mat img)
<span style="color:#6 {
<span style="color:#7
//float sum_w=0.0;//重新赋&#20540;为0,给下一个像素做累积
<span style="color:#8
for(int m=<span style="color:#;m&img.m&#43;&#43;)
<span style="color:#9
for(int n=<span style="color:#;n&img.n&#43;&#43;)
<span style="color:#0
<span style="color:#1
float sum_w=<span style="color:#.0;//重新赋&#20540;为0,给下一个像素做累积
<span style="color:#2
//chose the fittest number fit_num
<span style="color:#3
for(unsigned char a=<span style="color:#;a&GMM_MAX_COMPONT;a&#43;&#43;)
<span style="color:#4
<span style="color:#5
//cout&&w[a].at&float&(m,n)&&
<span style="color:#6
sum_w&#43;=w[a].at&float&(m,n);
<span style="color:#7
if(sum_w&=GMM_THRESHOD_SUMW)//如果这里THRESHOD_SUMW=0.6的话,那么得到的高斯数目都为1,因为每个像素都有一个权&#20540;接近1
<span style="color:#8
<span style="color:#9
fit_num.at&unsigned char&(m,n)=a&#43;<span style="color:#;
<span style="color:#0
<span style="color:#1
<span style="color:#2
<span style="color:#3
<span style="color:#4 }
<span style="color:#5
<span style="color:#6
<span style="color:#7 //gmm测试函数的实现
<span style="color:#8 void gmm_test(Mat img)
<span style="color:#9 {
<span style="color:#0
for(int m=<span style="color:#;m&img.m&#43;&#43;)
<span style="color:#1
for(int n=<span style="color:#;n&img.n&#43;&#43;)
<span style="color:#2
<span style="color:#3
unsigned char a=<span style="color:#;
<span style="color:#4
for(;a&fit_num.at&unsigned char&(m,n);a&#43;&#43;)
<span style="color:#5
<span style="color:#6
//如果对sigma取根号的话,树枝当做前景的概率会更大,不过人被检测出来的效果也更好些;用2相乘,不用开根号效果还不错
<span style="color:#7
if(abs(img.at&unsigned char&(m,n)-u[a].at&unsigned char&(m,n))&(unsigned char)(2*(sigma[a].at&float&(m,n))))
<span style="color:#8
if(abs(img.at&unsigned char&(m,n)-u[a].at&unsigned char&(m,n))&(unsigned char)(<span style="color:#.5*(sigma[a].at&float&(m,n))))
<span style="color:#9
<span style="color:#0
gmask.at&unsigned char&(m,n)=<span style="color:#;//背景
<span style="color:#1
<span style="color:#2
<span style="color:#3
<span style="color:#4
if(a==fit_num.at&unsigned char&(m,n))
<span style="color:#5
gmask.at&unsigned char&(m,n)=<span style="color:#5;//前景
<span style="color:#6
<span style="color:#7 }
<span style="color:#8
<span style="color:#9 //连通域去噪函数实现
<span style="color:#0 void find_connected_components(Mat img)
<span style="color:#1 {
<span style="color:#2
morphologyEx(gmask,gmask,MORPH_OPEN,Mat());
<span style="color:#3 //
morphologyEx(gmask,gmask,MORPH_CLOSE,Mat());
<span style="color:#4 }
<span style="color:#5
<span style="color:#6 ////连通域去噪函数实现
<span style="color:#7 //void find_connected_components(Mat img)
<span style="color:#8 //{
<span style="color:#9 //
morphologyEx(gmask,gmask,MORPH_OPEN,Mat());
<span style="color:#0 //
morphologyEx(gmask,gmask,MORPH_CLOSE,Mat());
<span style="color:#1 ////
erode(gmask,gmask,Mat());//只腐蚀是不行的,人来了也被腐蚀掉了
<span style="color:#2 //
<span style="color:#3 //
vector&vector&Point&&//由点向量组成的向量,所以有2个层次结构
<span style="color:#4 //
vector&Vec4i&//typedef Vec&int,4&Vec4i;即由4个整数组成的向量
<span style="color:#5 //
<span style="color:#6 //
//找到gmask的轮廓,存储在contours中,其拓扑结构存储在hierarchy中,且仅仅找出最外面的轮廓,用压缩算法只存储水平,垂直,斜对角线的端点
<span style="color:#7 //
//其中暗含了hierarchy[i][2]=hierarchy[3]=-1,即其父轮廓和嵌套轮廓不用考虑
<span style="color:#8 //
findContours(gmask,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
<span style="color:#9 //
if(contours.size()==0)
<span style="color:#0 //
<span style="color:#1 //
<span style="color:#2 //
int idex=0;
<span style="color:#3 //
for(idex=0;idex&contours.size();idex&#43;&#43;)
<span style="color:#4 //
<span style="color:#5 //
const vector&Point&& c=contours[idex];
<span style="color:#6 ////
const vector&Point&& cnull::zeros();
<span style="color:#7 //
double len=arcLength(c,false);//求出轮廓的周长,并不一定要求其是封闭的
<span style="color:#8 //
double q=(img.rows&#43;img.cols)/4;
<span style="color:#9 //
if(q&=len)
<span style="color:#0 //
<span style="color:#1 //
const vector&Point& &cnew=contours[idex];
<span style="color:#2 //
Mat mcnew=Mat(cnew);
<span style="color:#3 //
<span style="color:#4 //
approxPolyDP(Mat(c),mcnew,CVCONTOUR_APPROX_LEVEL,false);//多边形曲线拟合,并不一定要求其轮廓闭合
<span style="color:#5 //
approxPolyDP(Mat(c),Mat(cnew),CVCONTOUR_APPROX_LEVEL,false);//多边形曲线拟合,并不一定要求其轮廓闭合
<span style="color:#6 //
approxPolyDP(Mat(c),cnew,CVCONTOUR_APPROX_LEVEL,false);//多边形曲线拟合,并不一定要求其轮廓闭合
<span style="color:#7 //
cnew=vector&Point&(mcnew);
<span style="color:#8 //
contours[idex]=
<span style="color:#9 //
<span style="color:#0 ////
else contours[idex]=vector&Point(0,0,0)&;
<span style="color:#1 //
<span style="color:#2 //
<span style="color:#3 //}
<span style="color:#4
<span style="color:#5 ///////////////////////////////////////////////////////////////////////////////////////////
<span style="color:#6 //void cvconnectedComponents(IplImage *mask, int poly1_hull0, float perimScale, int *num, CvRect *bbs, CvPoint *centers)
<span style="color:#7 // This cleans up the forground segmentation mask derived from calls to cvbackgroundDiff
<span style="color:#8 //
<span style="color:#9 // mask
Is a grayscale (8 bit depth) &raw& mask image which will be cleaned up
<span style="color:#0 //
<span style="color:#1 // OPTIONAL PARAMETERS:
<span style="color:#2 // poly1_hull0
If set, approximate connected component by (DEFAULT) polygon, or else convex hull (0)
<span style="color:#3 // perimScale
Len = image (width&#43;height)/perimScale.
If contour len & this, delete that contour (DEFAULT: 4)
<span style="color:#4 // num
Maximum number of rectangles and/or centers to return, on return, will contain number filled (DEFAULT: NULL)
<span style="color:#5 // bbs
Pointer to bounding box rectangle vector of length num.
(DEFAULT SETTING: NULL)
<span style="color:#6 // centers
Pointer to contour centers vectore of length num (DEFULT: NULL)
<span style="color:#7 //
<span style="color:#8 //void cvconnectedComponents(IplImage *mask, int poly1_hull0, float perimScale, int *num, CvRect *bbs, CvPoint *centers)
<span style="color:#9 //{
<span style="color:#0 //
static CvMemStorage*
mem_storage
<span style="color:#1 //
static CvSeq*
<span style="color:#2 ////
static CvSeq**
<span style="color:#3 //
<span style="color:#4 //
//CLEAN UP RAW MASK
<span style="color:#5 //
//开运算作用:平滑轮廓,去掉细节,断开缺口
<span style="color:#6 //
cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_OPEN, CVCLOSE_ITR );//对输入mask进行开操作,CVCLOSE_ITR为开操作的次数,输出为mask图像
<span style="color:#7 //
//闭运算作用:平滑轮廓,连接缺口
<span style="color:#8 //
cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_CLOSE, CVCLOSE_ITR );//对输入mask进行闭操作,CVCLOSE_ITR为闭操作的次数,输出为mask图像
<span style="color:#9 //
<span style="color:#0 //
//FIND CONTOURS AROUND ONLY BIGGER REGIONS
<span style="color:#1 //
if( mem_storage==NULL ) mem_storage = cvCreateMemStorage(0);
<span style="color:#2 //
else cvClearMemStorage(mem_storage);
<span style="color:#3 //
<span style="color:#4 //
//CV_RETR_EXTERNAL=0是在types_c.h中定义的,CV_CHAIN_APPROX_SIMPLE=2也是在该文件中定义的
<span style="color:#5 //
CvContourScanner scanner = cvStartFindContours(mask,mem_storage,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
<span style="color:#6 ////
CvContourScanner scanner = cvFindContours(mask,mem_storage,firstContour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
<span style="color:#7 //
<span style="color:#8 //
int numCont = 0;
<span style="color:#9 //
while( (c = cvFindNextContour( scanner )) != NULL )
<span style="color:#0 //
<span style="color:#1 //
double len = cvContourPerimeter( c );
<span style="color:#2 //
double q = (mask-&height &#43; mask-&width) /perimS
//calculate perimeter len threshold
<span style="color:#3 //
if( len & q ) //Get rid of blob if it's perimeter is too small
<span style="color:#4 //
<span style="color:#5 //
cvSubstituteContour( scanner, NULL );
<span style="color:#6 //
<span style="color:#7 //
else //Smooth it's edges if it's large enough
<span style="color:#8 //
<span style="color:#9 //
<span style="color:#0 //
if(poly1_hull0) //Polygonal approximation of the segmentation
<span style="color:#1 //
c_new = cvApproxPoly(c,sizeof(CvContour),mem_storage,CV_POLY_APPROX_DP, CVCONTOUR_APPROX_LEVEL,0);
<span style="color:#2 //
else //Convex Hull of the segmentation
<span style="color:#3 //
c_new = cvConvexHull2(c,mem_storage,CV_CLOCKWISE,1);
<span style="color:#4 //
cvSubstituteContour( scanner, c_new );
<span style="color:#5 //
numCont&#43;&#43;;
<span style="color:#6 //
<span style="color:#7 //
<span style="color:#8 //
contours = cvEndFindContours( &scanner );
<span style="color:#9 //
<span style="color:#0 //
// PAINT THE FOUND REGIONS BACK INTO THE IMAGE
<span style="color:#1 //
cvZero( mask );
<span style="color:#2 //
IplImage *maskT
<span style="color:#3 //
//CALC CENTER OF MASS AND OR BOUNDING RECTANGLES
<span style="color:#4 //
if(num != NULL)
<span style="color:#5 //
<span style="color:#6 //
int N = *num, numFilled = 0, i=0;
<span style="color:#7 //
<span style="color:#8 //
double M00, M01, M10;
<span style="color:#9 //
maskTemp = cvCloneImage(mask);
<span style="color:#0 //
for(i=0, c= c != NULL; c = c-&h_next,i&#43;&#43; )
<span style="color:#1 //
<span style="color:#2 //
if(i & N) //Only process up to *num of them
<span style="color:#3 //
<span style="color:#4 //
cvDrawContours(maskTemp,c,CV_CVX_WHITE, CV_CVX_WHITE,-1,CV_FILLED,8);
<span style="color:#5 //
//Find the center of each contour
<span style="color:#6 //
if(centers != NULL)
<span style="color:#7 //
<span style="color:#8 //
cvMoments(maskTemp,&moments,1);
<span style="color:#9 //
M00 = cvGetSpatialMoment(&moments,0,0);
<span style="color:#0 //
M10 = cvGetSpatialMoment(&moments,1,0);
<span style="color:#1 //
M01 = cvGetSpatialMoment(&moments,0,1);
<span style="color:#2 //
centers[i].x = (int)(M10/M00);
<span style="color:#3 //
centers[i].y = (int)(M01/M00);
<span style="color:#4 //
<span style="color:#5 //
//Bounding rectangles around blobs
<span style="color:#6 //
if(bbs != NULL)
<span style="color:#7 //
<span style="color:#8 //
bbs[i] = cvBoundingRect(c);
<span style="color:#9 //
<span style="color:#0 //
cvZero(maskTemp);
<span style="color:#1 //
numFilled&#43;&#43;;
<span style="color:#2 //
<span style="color:#3 //
//Draw filled contours into mask
<span style="color:#4 //
cvDrawContours(mask,c,CV_CVX_WHITE,CV_CVX_WHITE,-1,CV_FILLED,8); //draw to central mask
<span style="color:#5 //
} //end looping over contours
<span style="color:#6 //
*num = numF
<span style="color:#7 //
cvReleaseImage( &maskTemp);
<span style="color:#8 //
<span style="color:#9 //
//ELSE JUST DRAW PROCESSED CONTOURS INTO THE MASK
<span style="color:#0 //
<span style="color:#1 //
<span style="color:#2 //
for( c= c != NULL; c = c-&h_next )
<span style="color:#3 //
<span style="color:#4 //
cvDrawContours(mask,c,CV_CVX_WHITE, CV_CVX_BLACK,-1,CV_FILLED,8);
<span style="color:#5 //
<span style="color:#6 //
<span style="color:#7 //}
作者:tornadomeet出处:/tornadomeet欢迎转载或分享,但请务必声明文章出处。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13387次
排名:千里之外
转载:10篇
(1)(1)(3)(2)(5)(1)}

我要回帖

更多关于 辐射3初始加点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信