关于图像匹配的问题

tztz520 2011-10-14 02:32:34
上次发帖跟大家讨论了一下关于图像匹配的问题, 最后还是决定用opencv, 刚好最近时间又多了,就把opencv2.1编译出来(源代码没动), 同时写了个DLL,把opencv的几个函数封装了一下, 想研究的童鞋到我的资源里下好了, 也提供了一个VB的使用源码.
...全文
737 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
大脸猫脸大 2013-05-24
  • 打赏
  • 举报
回复
tztz520 , 有没有模版匹配的代码呢? 谢谢!
jinjizhu 2013-05-06
  • 打赏
  • 举报
回复
这贴不能沉! 楼主是我偶像!
GAOYANGAOYANGAOYAN 2012-11-28
  • 打赏
  • 举报
回复
楼主有没有发现用cvGetHuMoments提取七个不变矩,提取出来的值有时候为0呢?
oshi002 2012-08-17
  • 打赏
  • 举报
回复
看看是咋回事这东西。
流萤 2012-04-04
  • 打赏
  • 举报
回复
我想问一下VB.net下怎么引用那个dll
zcadqewxs6 2011-12-31
  • 打赏
  • 举报
回复
在vb.net 中调用出错 "尝试读取或写入受保护的内存" 怎么解决呢?
cfvgodot 2011-12-31
  • 打赏
  • 举报
回复
必须留名收藏了
imtleo 2011-12-16
  • 打赏
  • 举报
回复
我试用了一下,发现很奇怪的现象,程序第一次调用OK,但一旦再次进入调试环境,再次进入调用,就用弹出:未找到文件:basepic.dll

时好时坏的,百思不得其解。
xuqin3 2011-12-12
  • 打赏
  • 举报
回复
楼主好人啊.
兔子侠客 2011-10-17
  • 打赏
  • 举报
回复
MARK!!
tztz520 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 laviewpbt 的回复:]
我已经下载了OPENCV 2.1的代码了,正在看,看他的算法原理是什么。
[/Quote]

哦,那行, 看源代码更方便了, 我也看了,也想过翻译成VB的代码, 但搞不定, 汗一个!!!!!
tztz520 2011-10-17
  • 打赏
  • 举报
回复
这个嵌套的层数太多了, 还有函数指针,模板等等. 这样帖不完的, 我把相关的CPP文件找出来,然后打个包你们下载看吧.
laviewpbt 2011-10-17
  • 打赏
  • 举报
回复
我已经下载了OPENCV 2.1的代码了,正在看,看他的算法原理是什么。
tztz520 2011-10-17
  • 打赏
  • 举报
回复
typedef struct CvMoments
{
double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; /* spatial moments */
double mu20, mu11, mu02, mu30, mu21, mu12, mu03; /* central moments */
double inv_sqrt_m00; /* m00 != 0 ? 1/sqrt(m00) : 0 */
}
CvMoments;


typedef struct CvHuMoments
{
double hu1, hu2, hu3, hu4, hu5, hu6, hu7; /* Hu invariants */
}
CvHuMoments;


CV_IMPL void cvGetHuMoments( CvMoments * mState, CvHuMoments * HuState )
{
if( !mState || !HuState )
CV_Error( CV_StsNullPtr, "" );

double m00s = mState->inv_sqrt_m00, m00 = m00s * m00s, s2 = m00 * m00, s3 = s2 * m00s;

double nu20 = mState->mu20 * s2,
nu11 = mState->mu11 * s2,
nu02 = mState->mu02 * s2,
nu30 = mState->mu30 * s3,
nu21 = mState->mu21 * s3, nu12 = mState->mu12 * s3, nu03 = mState->mu03 * s3;

double t0 = nu30 + nu12;
double t1 = nu21 + nu03;

double q0 = t0 * t0, q1 = t1 * t1;

double n4 = 4 * nu11;
double s = nu20 + nu02;
double d = nu20 - nu02;

HuState->hu1 = s;
HuState->hu2 = d * d + n4 * nu11;
HuState->hu4 = q0 + q1;
HuState->hu6 = d * (q0 - q1) + n4 * t0 * t1;

t0 *= q0 - 3 * q1;
t1 *= 3 * q0 - q1;

q0 = nu30 - 3 * nu12;
q1 = 3 * nu21 - nu03;

HuState->hu3 = q0 * q0 + q1 * q1;
HuState->hu5 = q0 * t0 + q1 * t1;
HuState->hu7 = q1 * t0 - q0 * t1;
}


CV_IMPL void cvMoments( const void* array, CvMoments* moments, int binary )
{
const int TILE_SIZE = 32;
int type, depth, cn, coi = 0;
CvMat stub, *mat = (CvMat*)array;
CvMomentsInTileFunc func = 0;
CvContour contourHeader;
CvSeq* contour = 0;
CvSeqBlock block;
double buf[TILE_SIZE*TILE_SIZE];
uchar nzbuf[TILE_SIZE*TILE_SIZE];

if( CV_IS_SEQ( array ))
{
contour = (CvSeq*)array;
if( !CV_IS_SEQ_POINT_SET( contour ))
CV_Error( CV_StsBadArg, "The passed sequence is not a valid contour" );
}

if( !moments )
CV_Error( CV_StsNullPtr, "" );

memset( moments, 0, sizeof(*moments));

if( !contour )
{
mat = cvGetMat( mat, &stub, &coi );
type = CV_MAT_TYPE( mat->type );

if( type == CV_32SC2 || type == CV_32FC2 )
{
contour = cvPointSeqFromMat(
CV_SEQ_KIND_CURVE | CV_SEQ_FLAG_CLOSED,
mat, &contourHeader, &block );
}
}

if( contour )
{
icvContourMoments( contour, moments );
return;
}

type = CV_MAT_TYPE( mat->type );
depth = CV_MAT_DEPTH( type );
cn = CV_MAT_CN( type );

cv::Size size = cvGetMatSize( mat );

if( cn > 1 && coi == 0 )
CV_Error( CV_StsBadArg, "Invalid image type" );

if( size.width <= 0 || size.height <= 0 )
return;

if( binary || depth == CV_8U )
func = momentsInTile<uchar, int, int>;
else if( depth == CV_16U )
func = momentsInTile<ushort, int, int64>;
else if( depth == CV_16S )
func = momentsInTile<short, int, int64>;
else if( depth == CV_32F )
func = momentsInTile<float, double, double>;
else if( depth == CV_64F )
func = momentsInTile<double, double, double>;
else
CV_Error( CV_StsUnsupportedFormat, "" );

cv::Mat src0(mat);

for( int y = 0; y < size.height; y += TILE_SIZE )
{
cv::Size tileSize;
tileSize.height = std::min(TILE_SIZE, size.height - y);

for( int x = 0; x < size.width; x += TILE_SIZE )
{
tileSize.width = std::min(TILE_SIZE, size.width - x);
cv::Mat src(src0, cv::Rect(x, y, tileSize.width, tileSize.height));

if( coi > 0 )
{
cv::Mat tmp(tileSize, depth, buf);
int pairs[] = {coi-1, 0};
cv::mixChannels(&src, 1, &tmp, 1, pairs, 1);
src = tmp;
}
if( binary )
{
cv::Mat tmp(tileSize, CV_8U, nzbuf);
cv::compare( src, 0, tmp, CV_CMP_NE );
src = tmp;
}

double mom[10];
func( src, mom );

if(binary)
{
double s = 1./255;
for( int k = 0; k < 10; k++ )
mom[k] *= s;
}

double xm = x * mom[0], ym = y * mom[0];

// accumulate moments computed in each tile

// + m00 ( = m00' )
moments->m00 += mom[0];

// + m10 ( = m10' + x*m00' )
moments->m10 += mom[1] + xm;

// + m01 ( = m01' + y*m00' )
moments->m01 += mom[2] + ym;

// + m20 ( = m20' + 2*x*m10' + x*x*m00' )
moments->m20 += mom[3] + x * (mom[1] * 2 + xm);

// + m11 ( = m11' + x*m01' + y*m10' + x*y*m00' )
moments->m11 += mom[4] + x * (mom[2] + ym) + y * mom[1];

// + m02 ( = m02' + 2*y*m01' + y*y*m00' )
moments->m02 += mom[5] + y * (mom[2] * 2 + ym);

// + m30 ( = m30' + 3*x*m20' + 3*x*x*m10' + x*x*x*m00' )
moments->m30 += mom[6] + x * (3. * mom[3] + x * (3. * mom[1] + xm));

// + m21 ( = m21' + x*(2*m11' + 2*y*m10' + x*m01' + x*y*m00') + y*m20')
moments->m21 += mom[7] + x * (2 * (mom[4] + y * mom[1]) + x * (mom[2] + ym)) + y * mom[3];

// + m12 ( = m12' + y*(2*m11' + 2*x*m01' + y*m10' + x*y*m00') + x*m02')
moments->m12 += mom[8] + y * (2 * (mom[4] + x * mom[2]) + y * (mom[1] + xm)) + x * mom[5];

// + m03 ( = m03' + 3*y*m02' + 3*y*y*m01' + y*y*y*m00' )
moments->m03 += mom[9] + y * (3. * mom[5] + y * (3. * mom[2] + ym));
}
}

icvCompleteMomentState( moments );
}
贝隆 2011-10-17
  • 打赏
  • 举报
回复
版主该出来加个精 不然天理难存
tztz520 2011-10-17
  • 打赏
  • 举报
回复
轮廓度相似的主函数:

cvMatchShapes( const void* contour1, const void* contour2,
int method, double /*parameter*/ )
{
CvMoments moments;
CvHuMoments huMoments;
double ma[7], mb[7];
int i, sma, smb;
double eps = 1.e-5;
double mmm;
double result = 0;

if( !contour1 || !contour2 )
CV_Error( CV_StsNullPtr, "" );

// calculate moments of the first shape
cvMoments( contour1, &moments );
cvGetHuMoments( &moments, &huMoments );

ma[0] = huMoments.hu1;
ma[1] = huMoments.hu2;
ma[2] = huMoments.hu3;
ma[3] = huMoments.hu4;
ma[4] = huMoments.hu5;
ma[5] = huMoments.hu6;
ma[6] = huMoments.hu7;


// calculate moments of the second shape
cvMoments( contour2, &moments );
cvGetHuMoments( &moments, &huMoments );

mb[0] = huMoments.hu1;
mb[1] = huMoments.hu2;
mb[2] = huMoments.hu3;
mb[3] = huMoments.hu4;
mb[4] = huMoments.hu5;
mb[5] = huMoments.hu6;
mb[6] = huMoments.hu7;

switch (method)
{
case 1:
{
for( i = 0; i < 7; i++ )
{
double ama = fabs( ma[i] );
double amb = fabs( mb[i] );

if( ma[i] > 0 )
sma = 1;
else if( ma[i] < 0 )
sma = -1;
else
sma = 0;
if( mb[i] > 0 )
smb = 1;
else if( mb[i] < 0 )
smb = -1;
else
smb = 0;

if( ama > eps && amb > eps )
{
ama = 1. / (sma * log10( ama ));
amb = 1. / (smb * log10( amb ));
result += fabs( -ama + amb );
}
}
break;
}

case 2:
{
for( i = 0; i < 7; i++ )
{
double ama = fabs( ma[i] );
double amb = fabs( mb[i] );

if( ma[i] > 0 )
sma = 1;
else if( ma[i] < 0 )
sma = -1;
else
sma = 0;
if( mb[i] > 0 )
smb = 1;
else if( mb[i] < 0 )
smb = -1;
else
smb = 0;

if( ama > eps && amb > eps )
{
ama = sma * log10( ama );
amb = smb * log10( amb );
result += fabs( -ama + amb );
}
}
break;
}

case 3:
{
for( i = 0; i < 7; i++ )
{
double ama = fabs( ma[i] );
double amb = fabs( mb[i] );

if( ma[i] > 0 )
sma = 1;
else if( ma[i] < 0 )
sma = -1;
else
sma = 0;
if( mb[i] > 0 )
smb = 1;
else if( mb[i] < 0 )
smb = -1;
else
smb = 0;

if( ama > eps && amb > eps )
{
ama = sma * log10( ama );
amb = smb * log10( amb );
mmm = fabs( (ama - amb) / ama );
if( result < mmm )
result = mmm;
}
}
break;
}
default:
CV_Error( CV_StsBadArg, "Unknown comparison method" );
}

return result;
}
tztz520 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 laviewpbt 的回复:]
你把OPENCV这一块的代码贴出来不,我搞个纯VB版本的给大家。
[/Quote]

我找找看, 因为这块代码跳转的很多,用到了不少的类, 如果用到汇编优化就更麻烦了.
laviewpbt 2011-10-17
  • 打赏
  • 举报
回复
就模版匹配和轮廓度相似这两个的,那个目标识别的就不用了,呵呵。
laviewpbt 2011-10-17
  • 打赏
  • 举报
回复
你把OPENCV这一块的代码贴出来不,我搞个纯VB版本的给大家。
tztz520 2011-10-17
  • 打赏
  • 举报
回复
都是开源的, 就是编译了一下而已
加载更多回复(18)

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧