资源简介
用VC++实现图像连通区域标记,很好用,可以计算出图像的连通区域个数并标记,用MFC实现,有界面

代码片段和文件信息
// Image.cpp: implementation of the CImage class.
//
//////////////////////////////////////////////////////////////////////
#include “stdafx.h“
#include “Image.h“
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CImage::CImage()
{
m_lpImgBits=NULL;
m_lpnMark=NULL;
m_lpBMPFileData=NULL;
m_lpShowMark=NULL;
}
CImage::~CImage()
{
Clear();
}
long CImage::MarkImage(BYTE bobjectGray)
{
//bobjectGray为目标的灰度值,文本可以设为255
/* 申请标记数组空间,记得要在CImage类的构造函数
中将m_lpnMark初始化为NULL 。*/
if ( m_lpnMark==NULL )
{ m_lpnMark= new int[m_ulngBitsCount];
ASSERT( m_lpnMark != NULL );
m_lpnMarkMove=m_lpnMark;
}
::memset((LPBYTE)m_lpnMark0m_ulngBitsCount*4);
int nMarkValue=1;
/* 每次标识的值,nMarkValue会在后边递增,
来表示不同的区域,从1开始标记。 */
int nMaxMarkValue=0; //记录最大的标识的值
int ij; //循环控制变量
/* 定义存放等价对的链表,其元素是 EqualMark类型,
定义list是为了节约存储空间。要使用Clist,
应该#include 。 */
CList < EqualMarkEqualMark > lEqualMark;
//初始化图像移动指针
m_lpImgBitsMove = m_lpImgBits;
/*进行第一次扫描,将所得的等价对(EqualMark类型)加到lEqualMark链表中。
使用nMarkValue来进行每一次新的标记,标记之后将其值加1。
由于版面关系,这部分代码也同样略去不写。作者提出以下几点编程时要注意
的地方。
Note1:图像的四周像素并不会有8个相邻的像素。这时就要根据上、下、左、
右四种不同的情况做不同的寻找等价对的判断。
Note2:可以先对等价对进行排序,每次都保证MarkValue1 这样易于管理等价对。
Note3:在实际工作中,连续寻找出的等价对很容易重复,将本次找出的等价对
和链表中保存的最后一个等价对相比较,如果不相等的话再存入等价对链表,
这样可以大大降低链表中等价对的重复。
Note4:第一次扫描之后,nMarkValue-1即为nMaxMarkValue。 */
/************************************************************************/
//下面为补充代码完成对图象的第一次扫描
//初始化图象数组和标识数组的指针
int nEqualNum=0;
EqualMark tempEqualMark; //用以暂时存放每次找到的等价关系
m_lpnMarkMove=m_lpnMark;
m_lpImgBitsMove = m_lpImgBits;
//标记图象的第一行、第一列的象素(只有这一个象素)
if ( *m_lpImgBitsMove==bobjectGray )
{
*m_lpnMarkMove=nMarkValue++;
}
m_lpnMarkMove++;
m_lpImgBitsMove++;
//标记图象的第一行,此时不会出现等价的情况
for ( i=1; i <= m_lngWidth; i++)
{
//需要标记的情况
if ( *m_lpImgBitsMove==bobjectGray )
{
//前面没有被标记过,则开始一个新的标记
if ( *(m_lpnMarkMove-1)==0 )
{
*m_lpnMarkMove=nMarkValue++;
}
//前面被标记过,则跟随前一个标记
else
{
*m_lpnMarkMove=*(m_lpnMarkMove-1);
}
}
m_lpnMarkMove++;
m_lpImgBitsMove++;
}
//除第一行之外的标记,此时会出现等价的关系
for ( j=1; j <= m_lngHeight; j++ )
{
m_lpImgBitsMove=m_lpImgBits+j*m_lngWidthBytes;
m_lpnMarkMove=m_lpnMark+j*m_lngWidthBytes;
//对每行的第一个点做处理,总体就是对图象的最左列做处理
//只需要检视上,右上两个点
if ( *m_lpImgBitsMove==bobjectGray )
{
//<上>位置被标记过
if ( *(m_lpnMarkMove-m_lngWidthBytes)!=0 )
{
//跟随<上>标记
*m_lpnMarkMove=*(m_lpnMarkMove-m_lngWidthBytes);
if ( *(m_lpnMarkMove-m_lngWidthBytes)!=*(m_lpnMarkMove-m_lngWidthBytes+1) && *(m_lpnMarkMove-m_lngWidthBytes+1)!=0)
{
//<上><右上>等价标记
AttachEqualMa
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2002-10-16 10:15 Mark\
文件 1279 2002-10-16 11:10 Mark\ImgMark.clw
文件 3597 2002-09-20 17:20 Mark\ReadMe.txt
文件 539 2002-09-20 17:20 Mark\ImgMark.dsw
文件 1335 2002-09-20 17:20 Mark\ImgMark.h
文件 2077 2002-09-20 17:20 Mark\ImgMark.cpp
文件 1477 2002-10-14 10:59 Mark\ImgMarkDlg.h
文件 5423 2002-10-16 10:03 Mark\ImgMarkDlg.cpp
文件 1054 2002-09-20 17:20 Mark\StdAfx.h
文件 209 2002-09-20 17:20 Mark\StdAfx.cpp
文件 823 2002-10-14 11:00 Mark\resource.h
文件 5440 2002-10-16 09:59 Mark\ImgMark.rc
文件 82944 2002-10-16 11:23 Mark\ImgMark.ncb
文件 4360 2002-10-16 10:54 Mark\ImgMark.dsp
文件 20960 2002-10-16 10:30 Mark\ImgMark.aps
文件 1964 2002-10-14 10:57 Mark\Image.h
文件 22687 2002-10-16 11:10 Mark\Image.cpp
文件 1845 2002-10-16 11:22 Mark\ImgMark.plg
文件 52736 2002-10-16 11:23 Mark\ImgMark.opt
目录 0 2002-10-16 11:22 Mark\Debug\
文件 131159 2002-10-16 11:22 Mark\Debug\ImgMark.exe
目录 0 2002-10-16 10:15 Mark\res\
文件 399 2002-09-20 17:20 Mark\res\ImgMark.rc2
文件 1078 2002-09-20 17:20 Mark\res\ImgMark.ico
文件 32114 1998-05-13 00:00 Mark\VFW32.LIB
目录 0 2002-10-16 10:31 o\
文件 131141 2002-10-16 11:07 o\ImgMark.exe
文件 19166 2002-10-14 10:39 o\MarkTest.bmp
文件 19166 2002-10-16 11:25 o\Result.bmp
文件 22686 2002-09-17 10:48 o\MarkTest2.bmp
- 上一篇:数据结构c语言版-单链表的操作程序代码
- 下一篇:rc4加密解密算法
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- MFC数字钟(基于VC6.0)
- 安科瑞智能电能表MODBUS通讯程序 VC6
- VC++MFC小游戏实例教程(实例)+MFC类库
- VC6LineNumberAddin.dll
- 用C语言进行数字图像处理
- 用VC6.0实现多边形扫描线填充算法
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- VC助手 VC6.0助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 基于esp32的摄像头采集图像代码
- 颜色识别形状识别STM103嵌入式代码
评论
共有 条评论