这篇文章最初发表在http://blog.youkuaiyun.com/j56754gefge/article/details/40793633,均是我原创,转载请注明出处!
Hungarian/Munkres Algorithm,即著名的匈牙利算法,常用来解决矩形分配问题:我有一些工作jobs,也有一些工人workers,我已经知道每个worker做各个job的耗费cost,那么我如何将各个job分配给各个worker才能使得总的cost最小呢??这就是匈牙利算法干的事情,他起初是用来解决workers和jobs个数一样多的情形,后来发展成能解决不等量worker-job分配问题。看看这个网页相信能给你一个对Hungarian算法的基本的了解:HungarianAlgorithm.com
实话说,我自己对匈牙利算法的原理了解不多,但是因为需要用到它,我就稍微查了点资料,比如咱们csdn上有相关博客,在matlab的文件中心搜一下关键词Hungarian能找到许多代码,因为急用,我翻写了其中一篇matlab代码,一个月来,使用情况较为满意,下面把代码贴出来与大家分享。
<span style="font-size:14px;">//文件munkres.cpp</span>
<span style="font-size:14px;">#include "cv.h"
using namespace cv;
using namespace std;
// B = A( extractRows, extractCols )
// Require:
// extractRows.size()==A.rows, extractCols.size()==A.cols
// sum(extractRows)==B.rows, sum(extractCols)==B.cols
void extractGrids( const Mat &A, const vector<bool> &extractRows, const vector<bool> &extractCols, Mat &B )
{
typedef float ValueType;
ValueType *pt1 = (ValueType*)A.data, *pt2 = (ValueType*)B.data, *pt3, *pt4;
const int step1 = A.step1(), rows = A.rows, cols = A.cols, step2 = B.step1();
vector<bool>::const_iterator it1, it2, it3 = extractRows.end(), it4 = extractCols.end();
for( it1=extractRows.begin(); it1!=it3; pt1+=step1 ){
pt3 = pt1;
if( *(it1++) ){
pt4 = pt2;
for( it2=extractCols.begin(); it2!=it4; pt3++ )
if( *(it2++) )
*(pt4++) = *pt3;
pt2 += step2;
}
}
}
// B = A( extract )
// Require:
// min(A.rows,A.cols) ==1
// if(A.rows)==1, then require: A.cols==extract.size(), B.rows==1, sum(extract)==B.cols
// if(A.cols)==1, then require: A.rows==extract.size(), B.cols==1, sum(extract)==B.rows
void extractDots( const Mat &A, const vector<bool> &extract, Mat &B )
{
assert( A.rows==1 || A.cols==1