LLC(Locality-constrained Linear Coding)基于OpenCV的C++源码实现
2014-02-28 18:04
609 查看
《Locality-constrained Linear Coding for Image Classification》的作者提供Matlab的代码实现,见http://www.ifp.illinois.edu/~jyang29/LLC.htm。
下面是根据作者的代码,基于OpenCV,实现的C++版的LLC:
下面是根据作者的代码,基于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; }
相关文章推荐
- 混合空间增强法(基于OpenCV的C++实现)
- 基于OpenCV和C++实现最大阈值分割算法
- SIFT特征2-基于OpenCV和C++的算法实现
- “基于关键字匹配的文本过滤系统”配置文件的设计和实现(C/C++源码)
- 直方图均衡化的 C++ 实现(基于 openCV)
- 基于MeanShift的Camshift算法原理详解(opencv实现,有源码)
- 基于Windows Socket的安全通信(C++实现,附源码)
- 连通区域标记:c++版的bwlabel实现(基于opencv)
- 基于VS C++平台的OpenCV设置,实现简单的行人检测
- C++基于OpenCV实现实时监控和运动检测记录
- 基于C++和OpenCv的SIFT_图像局部特征检测算法代码的实现
- 图像卷积操作的手动实现(基于opencv的C++编译环境)
- DCT变换及量化的c++实现(基于opencv矩阵运算)
- 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现
- 利用Opencv实现微信跳一跳脚本源码放送(C++实现嵌套python)
- 匈牙利算法的C++实现(基于OpenCV)
- 基于Windows Socket的安全通信(C++实现,附源码)
- 基于C++实现kinect+opencv 获取深度及彩色数据
- 基于OpenCV的人脸检测——C++和Python实现
- 基于OpenCV单目相机的快速标定--源码、工程、实现过程