舌下与结膜微血管血流速度检测是药物反应和疾病诊断的重要指证,但由于红细胞族之间的间隔随着血流的流动会发生聚合或分离,导致在序列时空图象上血流速度检测的困难,拟采用深度学习方法,在序列时空图象上准确检测微血管血流速度。由于现有的软件进行标注不方便、效率低,所以自己开发了个小的标注软件。采用C#编写。
标注软件的代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace STIDraw
{
public partial class Form1 : Form
{
private int m_ImgIndex = -1;
private List<string> m_FileList = new List<string>();
private List<YunLine> m_LineList = new List<YunLine>();
Pen m_Pen = new Pen(Color.Red, 2);
public Form1()
{
InitializeComponent();
label3.Text = "0";
label4.Text = "0";
label5.Text = "0";
label7.Text = "0";
}
public void ListFiles(FileSystemInfo info)
{
DirectoryInfo dir = info as DirectoryInfo;
FileSystemInfo[] files = dir.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = files[i] as FileInfo;
//是文件
if (file != null)
{
string extension = Path.GetExtension(file.Name);
if (extension.ToUpper() == ".JPG")
m_FileList.Add(file.FullName);
}
else//对于子目录,进行递归调用
ListFiles(files[i]);
}
}
private void button1_Click(object sender, EventArgs e)
{
m_STIList.Clear();
FolderBrowserDialog folder = new FolderBrowserDialog();
folder.Description = "选择文件所在文件夹目录"; //提示的文字
if (folder.ShowDialog() == DialogResult.OK)
{
m_ImgIndex = -1;
m_FileList.Clear();
DirectoryInfo folderInfo = new DirectoryInfo(folder.SelectedPath);
FileSystemInfo fileinfo1 = folderInfo as FileSystemInfo;
ListFiles(fileinfo1);
label3.Text = m_FileList.Count.ToString();
if (m_FileList.Count>0)
m_ImgIndex = 0;
ShowImage();
}
}
private void ShowImage()
{
int index = m_ImgIndex;
if (index < 0 || index >= m_FileList.Count)
return;
label4.Text = (m_ImgIndex +1).ToString();
pictureBox1.Image = Image.FromFile(m_FileList[index]);
}
private void Save2TxtFile()
{
int lCount = m_LineList.Count;
if (lCount < 1)
return;
string fPath = m_FileList[m_ImgIndex];
fPath = fPath.Substring(0, fPath.LastIndexOf(".")) + ".txt";
using (StreamWriter file = new StreamWriter(fPath, false))
for (int i = 0; i < lCount; i++)
{
string lstr = m_LineList[i].pt1.X.ToString() + "," + m_LineList[i].pt1.Y.ToString() + ";";
lstr = lstr + m_LineList[i].pt2.X.ToString() + "," + m_LineList[i].pt2.Y.ToString();
file.WriteLine(lstr);
}
// 清空线条
m_LineList.Clear();
label7.Text = "0";
pictureBox1.Invalidate();
}
// 显示下一张
private void button3_Click(object sender, EventArgs e)
{
int index = m_ImgIndex + 1;
if (index >= m_FileList.Count)
return;
// 提醒是否保存
if (m_LineList.Count > 0)
{
if (MessageBox.Show("是否保存当前结果?", "确认对话框", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
Save2TxtFile();
}
}
m_ImgIndex++;
ShowImage();
}
private void button2_Click(object sender, EventArgs e)
{
int index = m_ImgIndex - 1;
if (index < 0)
return;
m_ImgIndex--;
ShowImage();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
label5.Text = e.X.ToString() + ":" + e.Y.ToString();
int index = m_LineList.Count;
if (index < 1)
return;
index = index - 1;
if (m_LineList[index].status == 0)
{
m_LineList[index].pt2.X = e.X;
m_LineList[index].pt2.Y = e.Y;
}
pictureBox1.Invalidate();
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
int index = m_LineList.Count;
if (index < 1)
{
YunLine line = new YunLine();
line.pt1.X = e.X;
line.pt1.Y = e.Y;
line.pt2.X = e.X;
line.pt2.Y = e.Y;
line.status = 0;
m_LineList.Add(line);
return;
}
index = index - 1;
if (m_LineList[index].status == 0)
{
m_LineList[index].pt2.X = e.X;
m_LineList[index].pt2.Y = e.Y;
m_LineList[index].status = 1;
label7.Text = m_LineList.Count.ToString();
}
else
{
YunLine line = new YunLine();
line.pt1.X = e.X;
line.pt1.Y = e.Y;
line.pt2.X = e.X;
line.pt2.Y = e.Y;
line.status = 0;
m_LineList.Add(line);
}
pictureBox1.Invalidate();
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
int lCount = m_LineList.Count;
for (int i = 0; i < lCount; i++)
{
e.Graphics.DrawLine(m_Pen, m_LineList[i].pt1, m_LineList[i].pt2);
}
}
private void btnUpdo_Click(object sender, EventArgs e)
{
int lCount = m_LineList.Count - 1;
if(lCount<0)
return;
m_LineList.RemoveAt(lCount);
label7.Text = m_LineList.Count.ToString();
pictureBox1.Invalidate();
}
private void btnSave_Click(object sender, EventArgs e)
{
Save2TxtFile();
}
// 拷贝并重命名文件
private void button4_Click(object sender, EventArgs e)
{
int lCount = m_FileList.Count;
if (lCount < 1)
return;
FolderBrowserDialog folder = new FolderBrowserDialog();
folder.Description = "选择文件所在文件夹目录"; //提示的文字
if (folder.ShowDialog() == DialogResult.OK)
{
for (int i = 0; i < lCount; i++)
{
File.Copy(m_FileList[i], folder.SelectedPath + "\\STI-" + i.ToString()+".jpg");
//FileInfo fi = new FileInfo(m_FileList[i]);
//fi.MoveTo(folder.SelectedPath + "\\STI-" + i.ToString());
}
}
}
// 从列表中移除
private void button5_Click(object sender, EventArgs e)
{
this.button3.PerformClick();
}
private List<string> m_STIList = new List<string>();
private void button6_Click(object sender, EventArgs e)
{
m_STIList.Add(m_FileList[m_ImgIndex]);
this.button3.PerformClick();
//button3_Click
}
private void button7_Click(object sender, EventArgs e)
{
int lCount = m_STIList.Count;
if (lCount < 1)
return;
FolderBrowserDialog folder = new FolderBrowserDialog();
folder.Description = "选择文件所在文件夹目录"; //提示的文字
if (folder.ShowDialog() == DialogResult.OK)
{
for (int i = 0; i < lCount; i++)
{
File.Copy(m_STIList[i], folder.SelectedPath + "\\STI-" + i.ToString() + ".jpg");
//FileInfo fi = new FileInfo(m_FileList[i]);
//fi.MoveTo(folder.SelectedPath + "\\STI-" + i.ToString());
}
}
}
}
public class YunLine
{
public int status = -1;
public Point pt1 = new Point(0, 0);
public Point pt2 = new Point(0, 0);
}
}