// CellView.cpp : implementation of the CCellView class
// Download by http://www.NewXing.com
#include "stdafx.h"
#include "Cell.h"
#include "CellDoc.h"
#include "CellView.h"
#include "HSI.h"
#include "HSIDlg.h"
#include "HistogramDlg.h"
#include "Set.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MAX_HOLE 625
#define BITMAP_ID 0x4D42 // universal id for a bitmap
#define DISTANCE(x0,y0,x1,y1) sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1))
/////////////////////////////
// GLOBALS
HBITMAP g_hBitmap=NULL;
CString g_csFileName; // current open file name
int g_nMapWidth=0;
int g_nMapHeight=0;
//bool g_bImgBufferChanged;
RGB spec_rgb = { 0xff, 0x00, 0x00 }; // 标识色
//RGB * g_pOrgImgBuffer; // 全局的原始图像数据
RGB * g_pImgBuffer; // 全局的图像数据
//RGB * g_pImgBufferBack; // 全局的图像数据 用于redo
BYTE * g_pSobelResult; // Soble运算的结果
HSI * g_pHSIBuffer; // 全局的HSI数据
FLAGS * g_pFlags; // 全局的标志量
FLAGS * g_pFlagsBack; // 全局的标志量
bool g_bDir4Ero=false;
bool g_bDir4Dil=false;
long g_nCellCount=0;
long g_nCellTotArea=0;
/////////////////////////////////////////////////////////////////////////////
// 用于某些特定函数中的全局
CPoint scroll_lefttop; // scroll bar 左上角
double huegap,intgap,satgap; // 在FindInVectorHSI中使用.提高效率
long tot_area,tot_x,tot_y,max_radius; // 用于递归
vector<CENTER_POINT> points_temp; // 用于临时存储CENTER_POINT
int *qh; //queue handle
int *qs, *qst, *qr; //queue save, start, read
long qSz; //queue size (physical)
int xt, yt; //temporary x and y locations
/////////////////////////////////////////////////////////////////////////////
// CCellView
IMPLEMENT_DYNCREATE(CCellView, CScrollView)
BEGIN_MESSAGE_MAP(CCellView, CScrollView)
//{{AFX_MSG_MAP(CCellView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_PROC_HSI, OnProcHsi)
ON_WM_SETCURSOR()
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_COMMAND(ID_PROC_SOBEL, OnProcSobel)
ON_COMMAND(ID_DISP_SOBEL, OnDispSobel)
ON_COMMAND(ID_PROC_HISTOGRAM, OnProcHistogram)
ON_COMMAND(ID_PROC_SPEC_COLOR, OnProcSpecColor)
ON_COMMAND(ID_DISP_EDGE, OnDispEdge)
ON_COMMAND(ID_DISP_REGION, OnDispRegion)
ON_COMMAND(ID_PROC_RELOAD, OnProcReload)
ON_COMMAND(ID_PROC_FINDCENTER, OnProcFindCenter)
ON_COMMAND(ID_PROC_SOBEL_CORRECT, OnProcSobelCorrect)
ON_COMMAND(ID_PROC_FORCE_KILL, OnProcForceKill)
ON_COMMAND(ID_PROC_FORCE_SELE, OnProcForceSele)
ON_COMMAND(ID_PROC_DILATION, OnProcDilation)
ON_COMMAND(ID_PROC_EROSION, OnProcErosion)
ON_COMMAND(ID_PROC_SMOOTH, OnProcSmooth)
ON_COMMAND(ID_PROC_STAT, OnProcStat)
ON_COMMAND(ID_PROC_FILLHOLE, FillHoles)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCellView construction/destruction
CCellView::CCellView()
{
// TODO: add construction code here
m_DragRectSize.cx = 1;
m_DragRectSize.cy = 1;
g_csFileName = "";
g_pImgBuffer = NULL;
// g_pOrgImgBuffer = NULL;
// g_pImgBufferBack = NULL;
g_pHSIBuffer = NULL;
g_pFlags = NULL;
g_pFlagsBack = NULL;
g_pSobelResult= NULL;
// 所有布尔量初始化
// g_bImgBufferChanged=false;
m_bDrag=false;
m_bProcHsi=false;
m_bDispSobel=false;
m_bIsDispEdge=false;
m_bFullEdge=false;
m_bForceKill=false;
m_bForceAdd=false;
CSize sz(g_nMapWidth,g_nMapHeight);
SetScrollSizes(MM_TEXT, sz);
}
CCellView::~CCellView()
{
if(g_hBitmap)
DeleteObject(g_hBitmap);
if(g_pImgBuffer)
delete[] g_pImgBuffer;
// if (g_pOrgImgBuffer)
// delete[] g_pOrgImgBuffer;
// if (g_pImgBufferBack)
// delete[] g_pImgBufferBack;
if(g_pHSIBuffer)
delete[] g_pHSIBuffer;
if (g_pSobelResult)
delete[] g_pSobelResult;
if(g_pFlags)
delete[] g_pFlags;
if (g_pFlagsBack)
delete[] g_pFlagsBack;
}
BOOL CCellView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CCellView drawing
void CCellView::OnDraw(CDC* pDC)
{
int x,y;
CCellDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(g_hBitmap)
{
scroll_lefttop=GetScrollPosition();
RECT rect;
GetClientRect(&rect);
int drawwd,drawht;
if (g_nMapWidth>rect.right-rect.left)
drawwd=rect.right-rect.left+1;
else drawwd=g_nMapWidth;
if (g_nMapHeight>rect.bottom-rect.top)
drawht=rect.bottom-rect.top+1;
else drawht=g_nMapHeight;
BITMAPINFO bitmapinfo;
CDC *pdc = GetDC();
HDC dc = pdc->m_hDC;
HDC memdc = ::CreateCompatibleDC(dc);
::SelectObject(memdc, g_hBitmap);
if (m_bDispSobel) // 显示Sobel
{
BYTE *cur_pos=g_pSobelResult;
for(y = 0; y < g_nMapHeight; y++)
{
for(x = 0; x < g_nMapWidth; x++)
{
if (x-scroll_lefttop.x>=0 && x-scroll_lefttop.x<=drawwd && y-scroll_lefttop.y>=0 && y-scroll_lefttop.y<=drawht)
SetPixel(memdc,x,y,RGB(*cur_pos,*cur_pos,*cur_pos));
cur_pos++;
}
}
// g_bImgBufferChanged=false;
}
else
{
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biWidth = g_nMapWidth;
bitmapinfo.bmiHeader.biHeight = g_nMapHeight;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biBitCount = 24;
bitmapinfo.bmiHeader.biCompression = BI_RGB;
GetDIBits(memdc, g_hBitmap, 0, g_nMapHeight, NULL,
&bitmapinfo, DIB_RGB_COLORS);
FlipBitmapData(g_pImgBuffer); // flip it
SetDIBits(memdc, g_hBitmap, 0, g_nMapHeight, g_pImgBuffer,
&bitmapinfo, DIB_RGB_COLORS);
FlipBitmapData(g_pImgBuffer); // flip back
/* if (m_bIsDispEdge)
{
FlipBitmapData(g_pImgBuffer); // flip it
SetDIBits(memdc, g_hBitmap, 0, g_nMapHeight, g_pImgBuffer,
&bitmapinfo, DIB_RGB_COLORS);
FlipBitmapData(g_pImgBuffer); // flip back
}
else
{
FlipBitmapData(g_pImgBuffer); // flip it
SetDIBits(memdc, g_hBitmap, 0, g_nMapHeight, g_pImgBuffer,
&bitmapinfo, DIB_RGB_COLORS);
FlipBitmapData(g_pImgBuffer); // flip back
}
*/ }
::BitBlt(dc, 0, 0, drawwd, drawht, memdc, scroll_lefttop.x, scroll_lefttop.y, SRCCOPY);
FLAGS* cur_flag;
if(m_bIsDispEdge)
{
for(y = 0; y < g_nMapHeight; y++)
{
cur_flag=&g_pFlags[y*g_nMapWidth];
for(x = 0; x < g_nMapWidth; x++)
{
if(cur_flag->edged)
if (x-scroll_lefttop.x>=0 && x-scroll_lefttop.x<=drawwd && y-scroll_lefttop.y>=0 && y-scroll_lefttop.y<=drawht)
pdc->SetPixel(x-scroll_lefttop.x, y-scroll_lefttop.y, RGB(spec_rgb.r, spec_rgb.g, spec_rgb.b));
cur_flag++;
}
}
}
else // region
{
for(y = 0; y < g_nMapHeight; y++)
{
cur_flag=&g_pFlags[y*g_nMapWidth];
for(x = 0; x < g_nMapWidth; x++)
{
if(cur_flag->marked)
if (x-scroll_lefttop.x>=0 && x-scroll_lefttop.x<=drawwd && y-scroll_lefttop.y>=0 && y-scroll_lefttop.y<=drawht)
pdc->SetPixel(x-scroll_lefttop.x, y-scroll_lefttop.y, RGB(spec_rgb.r, spec_rgb.g, spec_rgb.b));
cur_flag++;
}
}
}
CENTER_POINT centerp;
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(spec_rgb.r, spec_rgb.g, spec_rgb.b));
pdc->SelectObject(pen);
for (int i=0;i<m_vCenterPoints.size();i++)
{
centerp=m_vCenterPoints.at(i);
Arc(pdc->m_hDC,
centerp.x-scroll_lefttop.x-centerp.radius,
centerp.y-scroll_lefttop.y-centerp.radius,
centerp.x-scroll_lefttop.x+centerp.radius,
C++医用血液、细胞识别程序源代码.rar
版权申诉
5星 · 超过95%的资源 72 浏览量
2021-03-08
13:14:04
上传
评论
收藏 843KB RAR 举报
卷积神经网络
- 粉丝: 337
- 资源: 8460
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈