LLC(Locality-constrained Linear Coding)基于OpenCV的C++源码实现

Locality-constrained Linear Coding for Image Classification》的作者提供Matlab的代码实现,见http://www.ifp.illinois.edu/~jyang29/LLC.htm

下面是根据作者的代码,基于OpenCV,实现的C++版的LLC:

cv::Mat BowModel::findKNN(cv::Mat &codebook, cv::Mat &input, int k) {
  int nbase = codebook.rows;
  int nquery = input.rows;
  Mat ii = input.mul(input);
  Mat cc = codebook.mul(codebook);
  
  Mat sii(nquery,1,CV_32FC1);
  sii.setTo(0);
  Mat scc(nbase,1,CV_32FC1);
  scc.setTo(0);
  for (int i = 0; i<ii.rows; i++) {
  	for (int j = 0; j<ii.cols; j++) {
  		sii.at<float>(i,0) += ii.at<float>(i,j);
  	}
  }
  for (int i = 0; i<cc.rows; i++) {
  	for (int j = 0; j<cc.cols; j++) {
  		scc.at<float>(i,0) += cc.at<float>(i,j);
  	}
  }
  
  Mat D(nquery,nbase,CV_32FC1);
  for (int i = 0; i<nquery; i++) {
  	for (int j = 0; j<nbase; j++) {
  		D.at<float>(i,j) = sii.at<float>(i,0);
  	}
  }
  
  Mat ct;
  transpose(codebook, ct);
  Mat D1 = 2*input*ct;
  
  Mat scct;
  transpose(scc, scct);
  Mat D2(nquery, nbase, CV_32FC1);
  for (int i = 0; i<nquery; i++) {
  	for (int j = 0; j<nbase; j++) {
  		D2.at<float>(i,j) = scct.at<float>(0,j);
  	}
  }
  
  D = D - D1 + D2;
  Mat SD;
  sortIdx(D, SD, CV_SORT_EVERY_ROW+CV_SORT_ASCENDING);
  Mat IDX(nquery,k,CV_8UC1);
  for (int i = 0; i<nquery; i++) {
  	for (int j = 0; j<k; j++) {
  		IDX.at<uchar>(i,j) = SD.row(i).col(j).at<uchar>(0,0);
  	}
  }
  
  ii.release();
  cc.release();
  sii.release();
  scc.release();
  D.release();
  ct.release();
  D1.release();
  scct.release();
  D2.release();
  SD.release();
  return IDX;
}

cv::Mat BowModel::llccode(cv::Mat &codebook, cv::Mat &input, cv::Mat IDX, int k)
{
	int nquery = input.rows;
	int nbase = codebook.rows;
	int dim = codebook.cols;

	Mat II = Mat::eye(k, k, CV_32FC1);
	Mat Coeff(nquery,nbase,CV_32FC1);
	Coeff.setTo(0);
	Mat z;
	Mat z1(k,dim,CV_32FC1);
	Mat z2(k,dim,CV_32FC1);
	Mat C;
	Mat un(k,1,CV_32FC1);
	un.setTo(1);
	Mat temp;
	Mat temp2;
	Mat w;
	Mat wt;

	for (int n = 0; n<nquery; n++) {
		for (int i = 0; i<k; i++) {
			for (int j = 0; j<dim; j++) {
				z1.at<float>(i,j) = codebook.at<float>(IDX.at<uchar>(n,i),j);
				z2.at<float>(i,j) = input.at<float>(n,j);
			}
		}
		z = z1 - z2;
		transpose(z, temp);
		C = z*temp;
		C = C + II*(1e-4)*trace(C)[0];
		invert(C,temp2);
		w = temp2*un;
		float sum_w=0;
		for (int i = 0; i<k; i++) {
			sum_w += w.at<float>(i,0);
		}
		w = w/sum_w;
		transpose(w, wt);
		for (int i = 0; i<k; i++) {
			Coeff.at<float>(n,IDX.at<uchar>(n,i)) = wt.at<float>(0,i);
		}
	}

	II.release();
	z.release();
	z1.release();
	z2.release();
	C.release();
	un.release();
	temp.release();
	temp2.release();
	w.release();
	wt.release();

	return Coeff;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值