图像处理工程师,专注图像处理多年,长期奋斗在图像增强、识别一线。实战经验丰富,研究开发的连铸体拼接算法、人脸美化算法、红外线血管增强识别系统、中药识别系统、石材大板识别系统等均已投入使用。对opencv有着深入理解和解析,以jsxyhelu账号参与OpenCV项目。
放大缩小看似简单,实际上还是比较复杂的。所以专门拿出来说明。 缩放这块,主要就是处理m_pDoc->m_scalefactor void CGreenOpenPaintView::OnButtonZoomin() { m_pDoc->ScaleFactorZoomIn(); OnU...
想显示一副图片相对来说比较容易。但是想在SDI中显示一个可以拖拽的矩形框,并且在滚动和缩放下都不变形,是很困难的。 MFC应该说在这个方面提供了强大的支持,但是也有一些是由于历史的原因需要去除的地方,特别是在缩放的这个地方还存在一些问题。
如果只是直接的图片保存和打开,是没有很多内容的。但是我这里,将EXIF的信息融入其中,使得图像处理的结果能够保存下来。这样就非常有价值意义了。 所有的操作都放在DOC中进行处理。 我之前已经对EXIF的操作进行总结,这里进行引入 #include "Exif.
1、DOC中添加,核心图片文件保存在这里。之所以不用Mat,是因为CVVImage有更好的输入输出函数。 我这里直接使用了public public: CvvImage m_image; 2、重载打开 //将文件的处理集中在DOC中是非常正确的方法 BOOL CGreenOpenPa...
标尺对于图像处理程序,特别是需要精确测量的程序来说意义很大。这里进行了专门的研究。 基于现在已经引入的类和定义的变量,主要讲一讲如何调用。 1、添加放大缩小 void CGreenOpenPaintDoc::ScaleFactorZoomIn(void) { if (m_fScaleFac...
Win7下的MSPaint是Ribbon的典型运行。这种SDI程序对于图像处理来说是很适合的。利用春节时间,基于之前的积累,我实现GreenOpenPaint,主要就是模拟MSPaint的界面,实现出现处理的结果。
最新版本的gexif,直接基于gdi+实现了exif信息的读取和写入,代码更清晰。 /* * File: gexif.h * Purpose: cpp EXIF reader * 3/2/2017 * 基于GDI+的EXIF读写类 */ //2017年2月3日 jsxyhelu 在原有...
MFC读写EXIF信息 读取有类库可以直接调用,网络上有直接可以用的;但是写Exif的资料非常少,我花了一点时间研究收集,终于成功。 将相关的资料共享。主要是借助gdi+,需要注意的地方很多 // ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
由于项目需要,进行过一段时间的 PariticalFilter 研究。主要的工作就是将网络上的Console代码和Mfc融合在一起,并且添加了Mfc端的控制功能。 程序还有不完善的地方,现将相关的函数发布出来,大家相互研究。
csharp编写界面,调用基于opencv的图像处理类库,是解决一类问题的优良方法。经过不懈研究,有最新进展: 一、目前情况和优点 位置在11.通过clr 架在clr.
--按语 一直有一些话,激励我不断努力 一、《青年选择职业时的思考》 马克思 1、认真考虑这种选择——这无疑是开始走上人生道路而又不愿意拿自己最重要的事业去碰运气的青年的首要责任; 2、每个人眼前都有一个目标,这个目标至少在他本人看上去是伟大的。
android环境的配置还是比较复杂的,特别对于我这样一直使用mfc的程序员来说,有很多观念上需要转变。好在配置成功后就能够不断复用,那么这样的问题值得整理出来 一、安装jdk 二、解压adt-bundle-windows(GO)。
《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践 一、问题提出 一般认为“Gabor小波感受野模拟线性滤波器,能对图像进行较好的智能收敛,从而智能增强图像。
在现有的图像处理软件中融合dxf格式输出 dxf格式是autocade的支持格式。如果将现有图像识别的结果导出到dxf格式,就能够使用autocad的强大功能进行后续处理。 dxf的格式比较复杂,开源支持库为libdxf,使用起来也比较复杂。
气泡的图像增强 对于这样的图片,如果只是基于普通的阈值处理、或者是梯度增强,都会因为背景比较复杂,从而结果不是很理想。很久之前,我的考虑就是要基于图像的本质特征。 什么是图像的本质特征?比如这里我关心的是圆的区域,它的特点就是梯度从四周向中心有强烈的抖动变化。
为现有图像处理程序添加读取exif的功能 exif是图片的重要参数,在使用过程中很关键的一点是exif的数据能够和图片一起存在。exif的相关功能在操作系统中就集成了,在csharp中也似乎有了实现。但是使用mfc来实现这个功能,的确费了我的一些时间。
通过学习,掌握以下几个问题: 1、核心算法,并且向GVF衍生; 2、核心库封装的方法 2016年11月16日06:52:51 昨日实现了梯度场和频率场的计算。最大的感觉就是建立基础代码库的重要性。 如果使用opencv或者别的代码库,可能它也能实现一些功能,特别对于建立在感官上的效果,差别不大。
添加.h和cpp #pragma once #include "afxwin.h" class mySplash : public CWnd { DECLARE_DYNAMIC(mySplash) protected: DECLARE_MESSAGE_MAP() ...
一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1、添加picture控件 2、添加资源,要求为bmp 3、修改属性 结果就可以了。
编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择;在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的。 基于现有资料,通过在实际项目中的积累,我总结出来一套结合opencv和mfc的摄像头采集框架。
图像处理系统中,镜头、光源的选配,对于最后能否产生稳定的识别效果至关重要。而搭载镜头、光源的是支架。机器视觉的支架一般都是根据项目的具体需要进行配置的,搜索淘宝能够得到一些商品。 这些支架形状不一,价格在数百元到千元之间;也有比较专业但是更贵的。
一般在高精度测量时需要做以下几个标定,一光学畸变标定(如果您不是用的软件镜头,一般都必须标定),二投影畸变的标定,也就是因为您安装位置误差代表的图像畸变校正,三物像空间的标定,也就是具体算出每个像素对应物空间的尺寸。
这样的程序主要实现windows平台下两个应用程序间的通信。 最简单的单元分为两个部分,一个是引用的程序,一个是被引用的程序。 一、如果引用他人,需要传递参数找到运行的程序,并且传递消息过去 void CShellExeDlg::OnBnClickedButton1() { // 如果没有打开程序,则打开程序。
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库。主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强。
//string替换 void string_replace(string & strBig, const string & strsrc, const string &strdst) { string::size_type pos=0; string::size_type srclen=strsrc.
//根据轮廓的圆的特性进行选择 vector selectShapeCircularity(Mat src,Mat& draw,vector contours,float minvalue,float maxvalue){ vector result_contours; draw = Mat::zeros(src.
//根据轮廓的面积大小进行选择 vector selectShapeArea(Mat src,Mat& draw,vector contours,int minvalue,int maxvalue){ vector result_contours; draw = Mat::zeros(src.
增强后的图像需要通过图像处理获得定量的值。在实际程序设计过程中,轮廓很多时候都是重要的分析变量。参考Halcon的相关函数,我增强了Opencv在这块的相关功能。 //寻找最大的轮廓 VP FindBigestContour(Mat src){ ...
// Multiply 正片叠底 void Multiply(Mat& src1, Mat& src2, Mat& dst) { for(int index_row=0; index_row
//使得rect区域半透明 Mat translucence(Mat src,Rect rect,int idepth){ Mat dst = src.clone(); Mat roi = dst(rect); roi += cv::Scalar(idepth,idepth,idepth); return dst; } 将选择的区域打上变成半透明。
//顶帽去光差,radius为模板半径 Mat moveLightDiff(Mat src,int radius){ Mat dst; Mat srcclone = src.
//填充孔洞 //fillholes Mat fillHoles(Mat src){ Mat dst = getInnerHoles(src); threshold(dst,dst,0,255,THRESH_BINARY_INV); ...
CString ExportListToExcel(CString sExcelFile,CListCtrl* pList, CString strTitle) { CString warningStr; if (pList->GetItemCou...
//获得当前目录路径 static CString GetLocalPath(){ CString csCfgFilePath; GetModuleFileName(NULL, csCfgFilePath.
//创建或续写目录下的csv文件,填写“文件位置-分类”对 int writeCsv(const string& filename,const VectorsrcVect,char separator ){ ofstream file(filename.
//递归读取目录下全部文件(flag为r的时候递归) void getFiles(string path, vector& files,string flag){ //文件句柄 long hFile = 0; /...
如何生成excel文件作为图像识别结果 在进行大规模图像处理的时候,如果能够以表格的形式生成结果文件,将非常的直观。这个时候,选择excel作为结果输出文件,将是合适的。 查询相关资料,有很多关于excel的操作方法,但是使用mfc来进行excel的操作,总是要涉及到很多东西。
长度和像素的转化 在做实际项目的时候遇到了“像素和厘米”的转化问题。 如图,尺上的10厘米在photoshop总能够被识别出来为10cm,证明图片本身就是按照实际大小来拍摄的。 查询相关的资料,得知: 图片中所谓“水平分辨率/垂直分辨率”表示的了这种转化关系。
图像处理程序的序列化和反序列化 所谓序列化,就是讲内存数据保存为磁盘数据的过程,反序列化就是反过来理解。对于图像处理程序来说,最主要的变量是图片,然后还有相关的参数或运算结果。 opencv本身提供了FileStorage的序列化保存方法,这对于保存参数来说非常适合;但是如果用来保存图片,会将原始图片的体积多倍增大,速度也比较慢。
来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
图像增强是图像处理的第一步。这里集成了一些实际使用过程中有用的函数。 //读取灰度或彩色图片到灰度 Mat imread2gray(string path){ Mat src = imread(path); Mat srcClone = src.
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库。主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强。
目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
【2016年7月4周】编译ITK 1、下载必备文件 InsightToolkit-4.8.1、cmake 2、cmake编译 修改CMAKE_INSTALL_PREFIX配置到需要生成的目录下面去。
[2016年7月4周]几款开源图像处理软件评测研究 一、做图像处理软件,不可避免地要进行一些界面操作。为此收集研究能够找到的图像处理软件。 基本的要求就是能够快速打开大图片、能够显示标尺、能够在图像上面显示我所需要显示的绘图对象。
新注册域名greenopen.site,向专业道路进军,欢迎访问!届时可以通过 greenopen.site jsxyhelu.github.io 或者jsxyhelu.cnblogs.com 访问本博客。
// openmptest的测试程序 // #include "stdafx.h" void Test(int n){ for (int i=0;i
一、首先实现 laplacian金字塔的分割和重构 #include "stdafx.h" #include #include #include #include #include #include #include using namespace std;...
//实现LUT 查找表 #include "stdafx.h" #include #include using namespace std; using namespace cv; void colorReduce(Mat &image,int div = 64){ ...
http://pan.baidu.com/s/1nvaTki1 这是一个简单的链表操作问题 "现有n个老鼠围成一圆圈,有一只猫从任意位置开始吃老鼠,每次都隔一个老鼠吃,请给出最后一个老鼠的编号?" 题目的具体要求是给出任给老鼠数n,输出猫最后吃的老鼠的编号。