资源简介
使用C++以及OpenCV实现的最小二乘法的平面拟合,以及应用平面拟合达到的图像背景去除。
代码片段和文件信息
/*==================================================================
= 代码内容:最大熵阈值分割
= 修改日期:2009-3-6
= 作者:crond123
= 博客:http://blog.csdn.net/crond123/
= E_Mail:crond123@163.com
====================================================================*/
#include “stdafx.h“
#include “cv.h“
#include “cxcore.h“
#include “highgui.h“
#include “cxerror.h“
#pragma comment(lib“highgui.lib“)
#pragma comment(lib“cv.lib“)
#pragma comment(lib“cvaux.lib“)
#pragma comment(lib“cxcore.lib“)
/*
* 假定 src mask 为8位单通道 dst 为 [3*1]矩阵
* 平面方程为 z = ax+by+c;
* 将实验数据带入方程 z 中得到
* |a|
* A|b| = b
* |c|
* A = (xiyi1) i=1-n n为待拟合点数
* b = (I(xiyi)) i=1-n n为待拟合点数
*
* 由最小二乘公式的
*
*
* |a|
* |b| = A+b = (A AH)-1 AH b
* |c|
*/
int LeastSquaresFittingPlane( const CvArr* src const CvArr* mask CvArr* dst)
{
CvMat input_hdr mask_hdr output_hdr;
CvMat* input_img *input_mask *output_img;
input_img = cvGetMat( src &input_hdr );
input_mask = cvGetMat( mask &mask_hdr );
output_img = cvGetMat( dst &output_hdr );
if( !CV_ARE_SIZES_EQ(input_imginput_mask) )
return -1;
int mask_count = 0;
int width = input_mask->width;
int height = input_mask->height;
for(int y=0;y for(int x=0;x {
if(CV_MAT_ELEM(*input_maskucharyx)>0)
mask_count ++;
}
CvMat* A = cvCreateMat(mask_count3CV_32FC1);
CvMat* AH = cvCreateMat(3mask_countCV_32FC1);
CvMat* A_mul_AH = cvCreateMat(33CV_32FC1);
CvMat* AH_mul_b = cvCreateMat(31CV_32FC1);
CvMat* b = cvCreateMat(mask_count1CV_32FC1);
// CvMat* result = cvCreateMat(31CV_32SC1);
int mask_index = 0;
for(int y=0;y for(int x=0;x {
uchar cur_val = CV_MAT_ELEM(*input_maskucharyx);
if(cur_val==0)
continue ;
CV_MAT_ELEM(*Afloatmask_index0) = (float)x;
CV_MAT_ELEM(*Afloatmask_index1) = (float)y;
CV_MAT_ELEM(*Afloatmask_index2) = (float)1;
CV_MAT_ELEM(*bfloatmask_index0) = (float)CV_MAT_ELEM(*input_imgucharyx);
mask_index ++;
}
cvTranspose(AAH); // AH = A的转制
cvMulTransposed(AA_mul_AH1);//A_mul_AH = A AH
cvInvert(A_mul_AHA_mul_AH);// A_mul_AH = (A_mul_AH)-1
cvmMul(AHbAH_mul_b);//AH_mul_b = AH b
cvmMul(A_mul_AHAH_mul_bdst);//dst = (abc)H = A_mul_AH AH_mul_b
cvReleaseMat(&A);
cvReleaseMat(&AH);
cvReleaseMat(&A_mul_AH);
cvReleaseMat(&AH_mul_b);
cvReleaseMat(&b);
return 0;
}
void backgroundCorrectLeastSquaresFittingPlane(IplImage * srcIplImage * dstIplImage * bgplane)
{
IplImage * mask = cvCreateImage(cvGetSize(src)IPL_DEPTH_8U1);
cvSet(maskcvScalar(255));
CvMat * result = cvCreateMat(31CV_32FC1
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4336 2009-03-06 10:11 LeastSquaresFittingPlane\LeastSquaresFittingPlane.cpp
文件 4556 2009-03-06 08:17 LeastSquaresFittingPlane\LeastSquaresFittingPlane.vcproj
文件 1428 2009-03-06 09:54 LeastSquaresFittingPlane\LeastSquaresFittingPlane.vcproj.WENYAOGUANG.Administrator.user
文件 1408 2009-03-05 19:27 LeastSquaresFittingPlane\ReadMe.txt
文件 210090 2009-03-06 09:54 LeastSquaresFittingPlane\result.jpg
文件 311 2009-03-05 19:27 LeastSquaresFittingPlane\stdafx.cpp
文件 376 2009-03-05 19:27 LeastSquaresFittingPlane\stdafx.h
文件 1125016 2009-03-02 21:07 LeastSquaresFittingPlane\test.jpg
目录 0 2009-03-06 10:16 LeastSquaresFittingPlane
----------- --------- ---------- ----- ----
1347521 9
相关资源
- 棋盘格标定图
- opencv视觉定位,C++编写的
- opencv循迹
- 任意曲线(S型等)调整图像色调,对
- Visual C++利用OpenCV对图像进行人脸识别
- 运用opencv的c++图像单点相关系数匹配
- VS2008 opencv MFC 计算米粒的个数及最大
- 14_车牌识别系统.zip
- 13_车型识别系统.zip
- 人脸跟踪基于opencv
- surf特征提取与匹配
- SRAD算法C++实现
- MFC+Opencv 摄像头保存为图像和视频
- TLD 全C++代码 OpenCV3.0.0 VS2013 工程文件
- [源码&文档] 基于OpenCV的室内目标跟踪
- 基于特征点匹配的视频稳像
- 制作自己的MFC MDI OPENCV程序框架
- 基于opencv开发的谷歌小恐龙的小游戏
- OpenCV图像模糊程序 by浅墨
- Opencv和vc++6.0一些常用图像处理算法程
- c++开发ocx入门实践三--基于opencv的简易
- opencv+c++实现人脸识别
- 基于OPENCV的完整图像处理程序
- MFC下opencv的图像处理源码
- OpenCV C++完整的车牌识别系统.rar
- OpenCV_MFC_版本1.0.1
- OpenCV_MFC_版本1.0
- opencv MFC 摄像头 人脸识别
- 实用的角度识别OPENCV
- opencv结合MFC进行人脸检测
评论
共有 条评论