科学网

 找回密码
  注册
科学网 标签 Visual 相关日志

tag 标签: Visual

相关日志

Latex学习笔记:(一)环境准备:Visual Studio Code + TeXLive + SumatraPDF
热度 1 xiaoxin960904 2020-9-21 21:23
目前是windows平台搭建的环境,个人查询了很多教程安装成功了之后,准备总结一下 结果发现最详细的教程和下载地址b站up主 十陆pb 都提到了还有视频版,按照他的方法可以完成90%的安装和测验,不影响使用 https://www.bilibili.com/video/BV1ht4y197Nz/ 大概梳理下流程: 注意:在安装和使用过程中所有的路径不要包含中文,除非你喜欢看不懂的errors 1 安装texlive 2 安装Visual studio code 这个可以不装,其实都是为了码代码和看pdf方便 3 安装sumatrapdf vscode新版对pdf支持的不错,但是不支持分屏,使用第三方的pdf查看软件是为了两个屏幕方便 4 基本配置和配置正逆向搜索 这里说一下up主没有提到的一小点,重点是正向搜索逆向搜索内容: 在setting.json里面设置的时候,路径写了两个,加了 '-r ',是因为有时发现sumatraPDF经常打开新的vsCode (以下内容放进json文件的括号里) latex-workshop.view.pdf.viewer : external , latex-workshop.view.pdf.external.viewer.command : E:/SumatraPDF/SumatraPDF.exe , latex-workshop.view.pdf.external.synctex.command : E:/SumatraPDF/SumatraPDF.exe , latex-workshop.view.pdf.external.synctex.args : 同理,在sumatraPDF的settings→advanced options→EnableTeXEnhancements 设置为 true 在settings→options出现 set inverse search command-line下输入 E:/VisualStudio/Microsoft VS Code/Code.exe E:\\VisualStudio\\Microsoft VS Code\\resources\\app\\out\\cli.js -r -g %f:%l 以上梳理下他没提到的几个问题,vscode安装后, latex workshop更新的很快,有很多命令新版就更改使用方法,导致老版(甚至是2019年)的可行方法不行了,但是基本逻辑没有变。
个人分类: LaTex学习|3311 次阅读|1 个评论
在 Visual Studio 中开发所需的工具和组件捆绑包中选择从某个方面入手
geneculture 2020-1-25 13:24
个人分类: 软件工程|0 个评论
10种JavaScript开发者必备的VS Code插件
stefanzan 2018-11-27 11:28
摘要: 好的代码插件可以让工作效率翻倍,心情也更加舒畅! 原文: 10 Must-have VS Code Extensions for JavaScript Developers 作者: Michael Wanyoike 译者: Fundebug 毫无疑问Visual Studio Code是最流量的轻量级代码编辑器。它确实从其它代码编辑器吸收了大量的概念,特别是Sublime Text和Atom。不过,它受欢迎的原因主要还是在于它的性能更好,并且十分稳定。另外,它还提供了我们最想要的原本只能在那种复杂的大型IDE像Eclipse或者Visual Studio 2017里面才有的智能代码提示(IntelliSense)这样的功能。 VS Code能够如此强大还源自于它的插件市场。归功于其开源社区,VS Code几乎支持所有的编程语言、框架和开发技术。并且有各种各样的支持方案,包括代码片段(snippets),语法高亮、Emmet和IntelliSense功能相关的技术。 在本文中,我专注于JavaScript开发者经常用到的插件。目前,针对JavaScript有非常多的VS Code插件,我也不可能面面俱到。因此,我会重点列出那些最流行的必不可少的插件。为了使本文更有条理,我将它们分门别类整理。 代码片段(Snippet)插件 当你第一次安装VS Code,它会提供基本的针对JavaScript/TypeScript的代码片段支持。当你要从事更加前沿的开发的时候,你就需要一些额外的代码片段插件来辅助你编写ES6/ES7代码。 VS Code JavaScript(ES6) snippets :它是如今最流行的,安装了超过120万的插件。该插件为JavaScript、TypeScript、HTML、React和Vue提供了ES6语法支持。 JavaScript Snippet Pack :JavaScript代码片段集合。 Atom JavaScript Snippet :从Atom移植过来的JavaScript代码片段。 JavaScript Snippets :ES6代码片段,并且包含Mocha、Jasmine和其它BDD测试框架的代码片段。 语法插件 VS Code自带的针对JavaScript的语法高亮已经相当不错。你可以安装不同的主题来改变代码的颜色。不过,如果你想要更好的可读性,可以安装代码高亮插件。这里有一些推荐: JavaScript Atom Grammar :该插件将Visual Studio Code自带的JavaScript语法替换成了Atom编辑器的版本。 Babel JavaScript :支持 ES201x JavaScript、React、FlowType和GraphQL代码的语法高亮。 DotENV :如果你使用Node,你需要它。DotEnv提供 .env 文件的语法高亮。 代码风格检查插件 为了保证整个团队代码格式的一致性,使用一个代码风格检查工具可以做到。ESLint是最流行的一个工具,因为它支持非常多的代码风格,包括标准的、Google和Airbnb。下面列出一些推荐的插件: ESLint :这个是最流行的代码风格检查插件,有超过670万的安装量。你可以在 .eslintrc.json 中配置。 JSHint :JSHint的代码风格检查插件。在项目的根目录下面,用 .jshintrcfile 配置。 JavaScript Standard Style : 一个无需配置的自带非常严格规则的代码风格检查插件。它强制要求你所有代码要遵循标准规则。 JSLint :JSLint的代码风格检查插件。 如果你想要了解各个插件的优缺点,可以看看这篇博客 JavaScript代码风格检查插件大评比 。 Node插件 每一个JavaScript项目至少需要安装一个Node包。这里推荐一些针对Node的插件: npm :使用 package.json 来验证已经安装的模块,确保已经安装的模块版本号正确,标记那些安装了但是没有在 package.json 列出来的包,以及那些还没有安装的包。 Node.js Modules IntelliSense :为JavaScript和TypeScript模块自动补全import语句。 Path IntelliSense :虽然并不是真的和Node相关,这个插件可以自动补全文件名,可以在输入时对本地文件进行智能提示。 Node exec :运行你执行当前的Node文件或者选中的部分代码。 View Node Package :通过此插件可以快速查看一个Node包的源代码。 Node Readme :快速打开npm包文档。 Search node_modules :搜索 node_modules 里面的代码,标准的搜索是不会包含该文件夹的。 Import Cost :显示引入的包的大小 代码格式化插件 你也许会发现,有时后复制粘贴完一段代码后,缩进的格式变乱,需要一行一行的调整十分麻烦。这个时候,你肯定想要一个代码格式化工具。 Beautify :安装量超过230万,Beautify是 jsBeautifier 的插件,支持JavaScript、JSON、CSS和HTML一键格式化。 Prettier Code Formatter :安装量超过150万,支持JavaScript、TypeScript和CSS的格式化,使用 Prettier (一个深受大家喜爱的格式化插件)。 JS Refactor :提供了许多重构JavaScript 代码的方法,例如提取代码中的变量和方法,将函数转换为使用箭头函数或模板字面量和将函数导出。 JavaScript Booster :一个非常棒的重构工具,比如将 var 替换为 const 或则 let ,移除无用的 else 语句,将变量声明和变量初始化合并。应该说很大程度上受到 Webstorm 的启发。 浏览器插件 除非你直接在控制台写JavaScript代码,大多数时候是在浏览器中执行的。也就是说,每一次代码更新,你都需要刷新页面来重写载入代码。如果一直手动操作,是很繁琐的。我们可以用插件来替代。 Debugger for Chrome :你只需要在代码编辑器中设置断点,在浏览器中会在断点处暂停。 Live Server :在本地开发环境中,实时重新加载(reload)页面。 Preview on Web Server :提供web服务器和实时预览。 PHP Server :对于仅需要在客户端运行JavaScript 代码做测试非常有用。 Rest Client :你不需要使用浏览器或则一个CURL程序来测试REST API,通过Rest Client可以在编辑器内交互式运行HTTP请求。 框架插件 对于大多数项目,为了节省开发时间,你往往会使用一个合适的开发框架来快速开发。在VS Code上,大多数框架都有相应的插件支持。但是依然有很多框架并没有对应的插件。 Angular 6 :超过220万的安装量,支持TypeScript、HTML、Angular Material ngRx、RxJS和Flex Layout。并且有172个Angular的代码片段。 Angular v5 snippets :超过270万的安装量,提供 TypeScript、RxJS、HTML和Docker文件的代码片段。 React Native/React/Redux snippets for es6/es7 :为这些框架提供ES6/ES7语法的代码片段。 React Native Tools :提供智能提示、命令行工具和Debugging功能。 Vetur :为Vue框架提供语法高亮、代码片段、Emmet、格式化、代码风格检查、智能提示、调试帮助等。有非常详细的文档: vetur 。 Ember :为Ember提供命令工具和智能提示。安装后,所有的 ember cli 命令都可以使用。 Cordova Tools :为Cordova插件和Ionic框架提供支持。提供代码智能提示、调试辅助以及其他特性。 jQuery Code Snippets :提供超过130个jQuery代码片段。 测试插件 在软件开发中,测试是必可不少的一个环节,特别是那些要上线到生产环境的项目。你可以看看我们这篇讲测试的文章: JavaScript Testing: Unit vs Functional vs Integration Tests 。下面是一些流行的测试插件: Mocha sidebar :使用Mocha库来提供测试支持。使用该插件可以直接在代码中运行测试并将提示错误。 ES6 Mocha Snippets :提供ES6语法的 Mocha代码片段。充分利用箭头函数,尽量不使用大括号来保持代码的简洁,可配置允许使用分号。 Jasmine Code Snippets :Jasmine测试框架的代码片段。 Protractor Snippets :Protractor框架的端到端(end-to-end)测试片段,支持JavaScript和Typescript。 Node TDD :为Node和JavaScript项目提供test-driven development支持。在代码更新的时候可以自动触发代码的测试。 其它很酷的插件 我把它们分类到 awesome 类别,是因为它们真的很酷。 Quokka.js :一个很棒的调试工具,可以为您正在编写的代码提供实时反馈,能够预览变量的函数和计算值结果。请查看文档: 文档 Paste as JSON :快速将JSON数据转换为JavaScript代码。 Code Metrics :这是一个用来计算JavaScript和TypeScript代码复杂度的插件。 插件包 VS Code的插件市场有一个类型叫 插件包 。它实际上已一个相互关联的插件的集合,方便一起安装,协同使用。 Nodejs Extension Pack :包含了ESLint、npm、JavaScript(ES6)代码片段、node_modules搜索、NPM智能提示和文件路径智能提示。 VS Code for Node.js – Development Pack :NPM智能提示,ESLint,Chrome调试器,Code Metrics,Docker和导入包的开销计算。 Vue.js Extension Pack :包含大约12个VS Code插件,有些在本文没有提到,比如auto-rename-tag和auto-close-tag。 Ionic Extesion Pack :包含许多用于Ionic、Angular、RxJS、Cordova和HTML开发的插件。 结语 VS Code能够如此流行的一个原因就是拥有大量的高质量插件。它前所未有的提高了编码的效率。比如ESLint助你减少代码失误,Debugger for Chrome让你更加方便去Debugging。Node.js的智能引入提示让你可以让你正确引入所需模块,Live Server和 REST Client可以让你省去频繁切换到外部工具的麻烦。我希望今天介绍的这些插件可以帮助你提高工作效率。 关于Fundebug Fundebug 专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了8亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用! 版权声明 转载时请注明作者 Fundebug 以及本文地址: https://blog.fundebug.com/2018/11/20/10-must-have-vs-code-extensions-for-javascript-developers/
个人分类: 工具|1981 次阅读|0 个评论
[转载]VS2010和VS2013同时安装visual assist X助手
linqy 2018-8-17 08:34
安装过程如下 本文以visual assist X10.9.2074.0的版本为例。 下载链接: http://pan.baidu.com/s/1hsu2cyK ,密码为:n7rf。 首先安装好VS2010和VS2013。 如果之前安装过VA_X,则需要先把旧版本的卸载。 解压下载的安装包,双击 VA_X_Setup2074.exe 运行。 弹出如下内容,选择VS2010和VS2013复选框: 安装完成后,进行破解。 VS2010破解: 复制解压文件中的 VA_X.dll 到VS2010的路径下: C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\VisualStudio\\10.0\\Extensions\\Whole Tomato Software\\Visual Assist\\10.9.2074.0 ,然后进行替换。 注意: Administrator 处为你实际使用的账户名称,这里我使用的是超级管理员账户。 VS2013破解: 复制解压文件中的 VA_X.dll 到VS2013的路径下: C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\VisualStudio\\12.0\\Extensions\\3wxaogfg.dqe ,然后进行替换。 注意: Administrator 处为你实际使用的账户名称,这里我使用的是超级管理员账户。 3wxaogfg.dqe 也不一样,根据实际而定。 打开VS2010或者VS2013,发现VA便已经生效了,并且菜单栏的 视图 按钮后已经多出来一个 VassistX 按钮。如图所示。
个人分类: C++|2157 次阅读|0 个评论
wordcloud python
wuxiaolananhui 2018-7-23 13:08
最近从该 https://www.lfd.uci.edu/~gohlke/pythonlibs/上下载不下来了东西,找了wordcloud包,但是双击依旧没反应,也不知道这个包安装的基础包是什么,就干脆瞎子摸象,按照传统方法自行安装,在dos命令下,输入 pip install wordcloud ,最终提示“ Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27” 于是就从 http://aka.ms/vcpython27上下载了改包,安装后, 再次安装wordcloud可以了 ----科研笔记存储系统
2989 次阅读|1 个评论
Python编译调试:超强组合之Visual Studio + Python
zhoufcumt 2017-11-1 14:43
众所周知,Visual Studio是开发Windows平台产品的利器,是C#、ASP.NET等应用开发的首选IDE。其实,Visual Studio也可作为Python IDE来使用。你只需在Visual Studio的基础上,安装PTVS(Python Tools for Vistul Studio)插件,即可快速将Visual Studio变成Python IDE来使用。 PTVS下载地址:https://docs.microsoft.com/en-us/visualstudio/python/installation,选择下载和已安装VS版本对应的PTVS版本。点击安装完成后即可使用,不用配置。
个人分类: Python|5001 次阅读|0 个评论
视觉适应使眼睛比相机看得更好
热度 7 Joshua3769 2016-5-29 19:44
视觉适应使眼睛比相机看得更好 你一定有过这样的体验:你看到美丽的风景,你拿出手机想拍下来,但糟糕的是,手机无法完整地呈现你所看到的不同方位景点的亮度和对比度,如果你使手机聚焦离天空近的地方,那么地面的楼房和树木可能变得很暗,而当你聚焦树木的时候,天空一片发白,云朵的层次又看不清了,更糟糕的是逆光拍摄时,你要拍的花朵或雕像几乎是黑的。为什么相机不能如你所愿地呈现画面呢? 1 、相机成像原理。 我们知道,照相机感光器件上每个像素点能把接受到的光亮强度转化为一定的电压,下图示意一个感光范围理想的感光像素的输入输出曲线: 像素点输出的是电压信号,会被相机转为数字信号,数字信号按照数值存储,值域可以很大,比如一张照片内最暗的地方取值 256 ,最亮的地方取值为 10000256 ,比最暗处高出 1000 万。按这样原始数值存储的照片格式叫 RAW 格式。但实际上日常所用的显示器或显示屏只能用 0-255 范围的数值表示亮度,这意味着,如果要把 Raw 格式的照片呈现到显示屏,需要把 256-10000256 映射到 0-255 ,这意味着将 1000 万个点的数值范围压缩到了 256个点的 数值范围,许多细节亮度将要丢失,那些原本较暗但可以辨认出细节结构的区域会显示为一片黑色。可见这样的直接映射不是好办法。事实上,相机采用的办法是将 Raw 中值域的某一段映射到 0-255 的办法,比如,当用户把相机中央对准天边,或镜头聚焦天边时,相机会认为用户更关注较亮位置的细节,因此可能会将 10000001-10000256 的值映射到 0-255 。这时候,天边附近的云或许层次分明,但地面显得很暗。假如我们关注地面,相机又会将低段值域映射到 0-255 ,这就使得天空一片发白。这就是相机总是显示不出我们想要的画面的原因。 所以我们要问:为什么眼睛可以?这就需要我们对视觉系统的构造和视觉适应( visual adaptation )机制有所了解。 2、 视觉系统的结构框架 。 视觉系统是一个复杂的层级结构,从低到高依次包括 光感受器 ( Photoreceptor ,类似相机的感光像素点,能将光信号转化为神经信号)、 神经节细胞 ( Ganglion cell ,能综合附近光感受器的信号形成中心外周拮抗的圆盘状感光结构,比如光照在中心时神经兴奋,光照在外周时神经抑制)、 外侧膝状体核 ( LGN ,能将 Ganglion cell 的信息中继给初级视觉皮层 V1 和上丘,也能被 V1 和上丘传下来的信号调控)、 V1 (初级视觉皮层,这里的细胞具有朝向选择性,不同的细胞偏好不同的朝向刺激)、 V2 (这里的细胞能对物体的边界归属有选择性反应,也能对双眼视差、颜色、运动方向等信息有选择性)、 V4 (这里的细胞能对复杂的形状有选择性反应,也对颜色、运动方向等信息有选择性)、 IT (这里的细胞能对客体有选择性反应,比如有的亚区专门用来编码人脸,有的专门编码工具、场景等),这些都处于大脑的腹侧通路,主要功能是进行客体识别,从 V1 和 V2 的信号也向背侧通路传递,这个通路包括了 MT 和顶叶的一些结构,主要负责视觉空间位置信息加工。 3、 视网膜( Retina )的适应功能 。 视网膜铺满了两类 Photoreceptor ,一类叫 Cone (椎体细胞),一类叫 Rod (杆状细胞)。前者主要集中在中心视野( Fovea ),能感知红绿蓝三色光,是我们获得色彩知觉的基础,并且由于它的神经响应( Response )在很亮的光照下仍然不会饱和(任何的感光元件都有其感光范围,小于这范围时元件响应主要受噪声主导,大于这个范围会使元件的响应饱和),因此我们在光亮环境下看东西主要是 Cone 的功劳。而 Rod 细胞主要散布在周边视野,只能感知明暗,其神经响应在明亮环境下就会饱和,但在夜间表现良好。一件有趣的事情是:当你在夜间盯住天上的一颗星星时,你会感觉周边视野的星星显得很亮,但当你再去盯那个亮星星时,你又感觉它不亮甚至看不见了,这是因为盯住一个点看时主要用的是 Cone 细胞,而不盯时用的是周边视野的 Rod 细胞。 Rod 细胞和 Cone 细胞之所以能对不同光亮做出响应,是因为细胞内具有可以将光量子转换为神经信号的物质,可是,当环境非常明亮时,越来越多的 Rod 细胞内的这类物质会被消耗殆尽,当环境更亮时, Cone 内的也开始消耗。 Rod 细胞内这些物质的再生需要十几到三十分钟,这就是 Dark Adaptation 的机制,即从室外进入黑暗环境下时我们需要较长的时间才能恢复暗视觉,但 Cone 只需要 1 分钟左右,这就意味着如果有一种炸弹能闪烁极亮的光芒,那么人会在 1 分钟以内看不清东西。当人从暗室走到明亮的室外时会感到刺眼疼痛,但过一会儿就会适应,这个过程叫 Light Adaptation ,其机制可能跟 Photoreceptor 的 G ain Control (增益控制) 有关。 Photoreceptor 与相机中的感光元件有一点不同:一种光照亮度并不总是引起同样强度的神经响应,这是由于 Gain Control 的原因。所谓 gain ,可以理解为特定单位的光子所能引起的神经响应的强度。实验发现,随着背景光亮度增加,打在 Photoreceptor 上的固定数量的光子所引起的神经响应会降低。这意味着 photoreceptor 的 gain 被细胞周围的亮度控制了。那么这种控制是如何实现的呢?现在似乎没有清楚的结论,有些动物眼睛中相邻的 Rod 和 Cone 细胞会相互调节对方,但有学者认为是与该 photoreceptor 相连接的 Ganlion cell 在调控,其调控的方法可能是根据邻近细胞所接受到的亮度(背景亮度)来调控该细胞对一定亮度刺激的响应。无论如何, 在视网膜上,一个 photoreceptor 对特定亮度的响应不是一成不变的,而是随邻近空间的亮度变化,也随过去一段很短的时间内的历史亮度而变化 ,可见这种 gain control 是在局部进行,是在微小的空间和微小的时间段内(一些研究认为是 100-200ms ,参考 Robert Shapley 1984 )进行的。 Gain control 的机制或许能解释 Light Adaptation :暗环境下的 photoreceptor 的 gain 很大,微弱的亮度增加就会带来神经的猛烈响应,这时候突然进入很亮的环境时,细胞都会猛烈活动,也许会带来附近血流的增加,进而挤压神经带来疼痛感,也可能是猛烈的活动信号传递给上丘,最终传递给负责痛觉脑区,使大脑产生保护行为:缩小瞳孔、闭眼睛,但过一会儿细胞可能会逐渐调整 gain ,从而适应外界环境。 Photoreceptor 的这种 gain control 带来的结果就是:神经响应所编码的不是亮度信息,而是对比度( Contrast )信息,这一点在 Ganglion 细胞上可能表现得更突出。由于 Ganglion 细胞整合了附近 photoreceptor 的信号,因此能得知这些细胞接受到的光亮的平均值,也能获得感受野( Receptive Field ,可以理解成与其相连的 photoreceptor 所形成的盘状结构)中心位置的 photoreceptor 感知到的亮度与邻近亮度的差异,从而形成其感受野内的对比度信息。实验表明, Ganglion 细胞能对不同的 Contrast 有不同的 Response ,如下图所示(图片来源 Luiz Carlos L. Silveira etc. ,2014, Plos One ,我不喜欢 Plos One ,但这张图片确实很直观,图中三条线分别对应三种刺激的空间频率)。当然, Ganglion 细胞对 Contrast 的响应也受到感受野内刺激的 Spaital Freqency 和 Temporal Frequency 的调制,可见视网膜对空间局部位置的光学信息进行了时间和空间上的复杂处理。 4、 照相机的 HDR 模式 事实上,为了解决文章开头所提到的技术问题,相机工业界早就有了解决方案,即 High Dynamic Range ( HDR ),据说这个技术的原始版本距今已有 150 年(参考 Fred Rieke Michael E. Rudd, Neuron, 2009 )。这个技术的原理可以这样理解:对场景中的每个微小局部,都配备一个相应的电压值范围,然后根据此范围去调整每个像素应该输出的电压。而本文开头的传统方法是对整张图配备一个固定的值域。局部分配有这样的好处:在一个相对小的局部,光亮变化范围不会很大,假如在某个局部最亮与最暗处的电压值差异是 256 ,则刚好能映射到屏幕可以显示的值域内,那么这个局部就不会出现太多的亮度信息丢失,保留了较为真实的对比度,据 Shapley 所言,对比度正是我们对世界具有亮度不变性( Luminance Constancy ,即不管外面有多亮多暗,你总感觉树叶是绿的,皮肤是黄的)感知的原因。上述仅仅是技术原理,不同公司可能有不同的技术细节,产生不同的呈现效果,但由上可知, HDR 技术与视网膜加工亮度的局部性和 Contrast 驱动响应的特性极为相似。不过目前的手机仍然不能优秀地表现 HDR 的效果,一方面是需要连续拍摄 3 张以上照片来获得不同值域上的亮度信息,从而消耗时间,并可能由于手抖而无法保证效果,但也可能是人们对视网膜的工作机制的细节还不够了解,无法设计出匹配的算法。下图第一张是一张比较理想的 HDR 图,能将日光和暗处的河流细节都表现出来,第二张是天空下的埃菲尔铁塔,请注意塔的边缘和云的交界处发白,可见算法存在缺陷。 5、 视觉系统的其他适应功能 事实上,视觉系统的适应功能十分复杂,能在不同方面调节我们看到的画面,使我们产生生动的图画感知。在视网膜上主要是通过 Ganglion 细胞等实现了局部的对比度信息保留,不过从这里一直到 V1 皮层,对比度的 gain control 仍然在发生。在 LGN ,由于 V1 和上丘的调节,这里可能根据较大范围的画面信息对 LGN 中编码中心外周拮抗圆盘结构的细胞响应进行了调节。在 V1 ,可能来自 V2 或 V4 等更高级视觉区的投射能调控 V1 对朝向结构的响应,比如单独一根 45 度的小 bar 能引起 V1 每秒 40 次脉冲发放,但如果把这个小 bar 放在按直线排列的一组小 bar 背景中时,脉冲数量会大大减少。在 IT 可能也发生着复杂的 adaptation ,比如人脸后效( Face Aftereffect )。此外,注意本身也能产生显著的 gain control 的功能,比如当注意某个位置的朝向条纹时,相应位置的神经元对不同朝向的响应强度会改变。这些都说明, 大脑的视觉系统能在不同层级按照当前的任务和注意状态对不同视觉元素或成分进行调控,使我们产生更加生动灵活的视觉感知 ,从而使我们适应环境,得以生存,并享受大自然的瑰丽景观。 总结: Visual Adaptation 方面的研究进展国内几乎没有通俗的报道,在简体中文媒介中缺乏传播和讨论,本文对这个概念进行了简介。另外也特别希望看到国内能多一些专业人士将国外的视觉科学研究进展以中文的方式通俗报道,便于国人了解。之前曾好奇手机屏幕为什么在阳光底下几乎看不清,知乎上一些人竟然说是瞳孔的作用,也有说是注意的作用导致的,但本人简单观察了一下,发现其实是屏幕反射的光的强度掩蔽了手机内容的亮度,可见专业科研人员多写一些科普文章还是有用的。另外就是特别期待国内某些大学能设置 School of Vision Science and Art ,设立光电、图像采集、图像呈现、摄影艺术、视觉科学、脑科学等专业,促进视觉科学与相机设计和摄影艺术等学科的交叉,促进视觉科学对成像技术的启发,从而增强本国在图像领域的发展。 主要参考文献: 1. Shapley R. and Enroth-Cugell C. (1984). Visual adaptation and retinal gain controls. In Retinal Research. 2.Fred Rieke and Michael E. Rudd. (2009). The Challenges Natural Images Pose for Visual Adaptation. Neuron.
6328 次阅读|9 个评论
Mathematica 与 Visual Studio
yanqiaokai 2015-11-26 00:41
Mathematica 10.3 VisualStudioCompiler.m $VisualStudioVersions = { 2015, 2013, 2012, 2010, 2008, 2005} installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment
3215 次阅读|0 个评论
Visual Studio项目属性的一些配置项的总结
T573029173 2014-10-11 15:10
【此文为网络资料整理版】 这几天刚好要做一个决策支持系统软件的框架搭建,看到网上一些较好的资料整理了下,给大家分享。 一、 Visual Studio 项目的文件组织方式 VC6.0 之后的 VC (VS) 系列使用解决方案 (Solution) 来替代原来的工作空间,用于组织和管理多个相关的项目 (Project) 。 VS 中的每个管理器 ( 解决方案或项目 ) 都会对应一个总的文件夹,这个管理器文件夹下存放本管理器的配置文件以及子管理器。以 C# 项目为例,解决方案管理器总文件夹下包含解决方案配置文件 *.sln 和项目子管理器文件夹,而项目子管理器文件夹下包含 C# 源文件 *.cs 、项目配置文件 *.csproj 、 Properties 属性文件夹、 obj 文件夹和 bin 文件夹。其中 obj 和 bin 文件夹下各包含 debug 和 release 两个文件夹。 obj 文件夹下存放中间编译结果, bin 文件夹下存放最终生成的 exe 或 dll 文件。 二、常用项目属性和系统默认配置变量 通常程序开发步骤包括编辑程序、编译程序、装配链接程序、程序调试测试、安装部署。表 1 给出了程序开发过程中常用的系统变量名和意义: 表 1 项目配置常用的系统变量名和意义 图 1 是某一个工程设置的例子,下面的案例中是以新建一个 MyProject 的项目为例: 图 1 注意:从上图可以看出, TargetDir 指目标目录,是一个目录。而 TargetPath 是目标路径,包括具体的文件名。 2.1 常规 — 输出目录 项目属性的“常规”栏目中“输出目录 (OutDir) ”的 作用是给 $(OutDir) 系统变量赋值,其 默认属性值为 $(SolutionDir)$(ConfigurationName) , $(SolutionDir) 表示解决方案目录, $(ConfigurationName) 的值为 debug 或 release 。启动编译后会在解决方案文件夹下建立 debug 文件夹。 也就是说默认情况下的输出目录是在解决方案目录下的 debug 或 release 文件夹下,当然这是针对 C++ 型项目而言, C# 型项目不一样。 2.2 常规 — 中间目录 项目属性的“常规”栏目中,“中间目录 (IntDir) ”的作用是存储链接器所需的输入文件,默认属性为 $(ProjectDir)$(ConfigurationName) ,编译后会在 MyProject 项目文件夹下建立一个 debug 文件夹,并在该文件夹下生成 MyProject.obj 二进制文件。 2.3 链接器 — 常规 — 输出文件 项目属性的“链接器”栏目下,“常规”选项下,“输出文件”默认属性为 $(OutDir) \ $(ProjectName).exe ,其中 $(OutDir) 指的是输出目录,启动链接后,在输出目录下生成 MyProject.exe 文件。 $(TargetDir) 的值是由“输出文件”指定的目录决定的。也就是链接器最后生成的 *.exe 文件所在位置。 图 2 “ 输出目录 ”和“ 输出文件 ”两个属性对应的目录默认情况下是一样的,这样用着方便。如果两个不一样,则链接器所需的 *.ilk 和 *.pdb 等中间文件在“ 输出目录” ,而最终生成的 exe 文件在“ 输出文件 ”属性设置的目录中。 2.4 调试 — 命令 项目的“输出目录”属性值决定着系统变量 $(OutDir) 的值,而项目的“输出文件”的属性值决定着 $(TargetDir) 和 $(TargetPath) 的值。 程序调试时,系统变量 $(OutDir) 的值是最先确定的,而 $(TargetDir) 和 $(TargetPath) 的值是在链接器生成 exe 文件后才确定的。 “调试”栏目中的“命令 (Command) ”属性项,这个属性表示启动调试器时执行的 exe 文件“ 全路径名 + 文件名”,默认为链接器生成的 $(TargetPath) 目录, 当然你也可以手动更改 “ 命令 ” 属性的值。 图 3 单击调试按钮 (VS 中的那个小三角形按钮 ) , VS 会起动图中所示目录下的 exe 文件。一般来说“链接器”— “输出文件”与“调试”— “命令”中的文件位置、名称是相同,以表示链接器生成的文件和调试时使用的文件一样。一言以蔽之,① “调试”— “命令” 、② TargetPath 、③ 输出文件,④ 输出目录 (OutDir) 默认情况下是处于同一个目录,并呈现出前一个紧密依赖于后一个的关系。 2.5 调试 — 工作目录 工作目录 (WorkingDirection ) 与执行目录 (Command) 可以不同, 它是程序工作运行过程中默认读取的目录, 调试时是将工作目录下的文件作为附加参数添加到执行目录的 exe 文件中去调试执行。 “调试”栏目中的“工作目录”项,默认属性值为 $(ProjectDir) ,即工程配置文件 MyProject.vcproj 所在目录,调试过程中它会随着 OpenFileDialog 、 SaveFileDialog 等对象所确定的目录而改变。对于静态链接的 lib 和 dll 库文件可以放入 exe 所在的执行目录,而动态加载的 dll 一般放在工作目录,比如插件就放在工作目录。此外,程序运行过程中生成一个 txt 文本文件或读取一些配置文件,如果在创建或读取过程中未指定绝对路径,只指定其文件名,那么默认的路径就是工作目录。 VS 中工作目录是用于调试过程,只有在调试时, VS 才会把项目配置属性中的工作目录设置为执行进程的工作目录,然后再启动对应的 exe 程序。如果用户选择直接双击一个 exe 程度启动新进程, VS 会自动把 exe 文件所在的目录设置为新进程的工作目录。 因此,在软件部署发布的时候,需把工作目录内的文件拷贝到 exe 所在的执行目录内,否则就会运行出错。 2. 6 链接器 — 输入 — 附加依赖项 “链接器”栏目下,“输入”选项下,“附加依赖项”属性。此项是设置程序链接时使用的静态库的名称。相当于链接已经编译好了的“代码”。由此我们可以简单的认为这些库就相当于我们自己写的源文件,只不过这些库是编译好了的源文件而已。 图 4 三、案例操作演示 3.1 前期准备工作 为了增强读者对前面内容的理解,此部分将通过一个实际的案例对其进行演示,假设我们期望的目录结构如下图所示。解决方案的名称为 GMA ,包含一个动态链接库项目 ChocolateMilk( 生成 dll) 和一个应用程序项目 PureMilk( 生成 exe) ,需要使用一个第三方库 log4cxx(Apachelog4j 的 C++ 移植版本,用于日志输出 ) 。 log4cxx 是以动态库的方式编译的,所以我们需要它的①导入库 (log4cxxd.lib) ,②头文件和③动态链接库 (log4cxx.dll) ,分别位于 Lib 、 Include 和 Bin 中。 图 5 1) GMA 是解决方案目录 2) PureMilk 和 ChocolateMilk 是项目目录 3) Lib 目录用于存放导入库或者静态库 ( 包括第三方库和用户项目生成库 ) 4) Include 用于存放 第三方库 的头文件 5) Bin 目录存放所有动态链接库和执行档,包括自己的产出和第三方库,分 Release 和 Debug 两个版本。另外,程序运行过程中需要外部的数据文件和启动时需要的配置文件等等都可放于该目录 6) Temp 用于存放临时生成文件,其中 Compile 存放编译器编译时生成的 obj 文件, Link 存放链接器的输出文件。 7) PureMilk 和 ChocoliteMilk 两个项目的头文件和源文件位置不要动,仍然在各自的项目文件夹内。 上面目录结构清晰,一目了然,当我们的程序需要制作安装包时我们只需将 “Bin/Release” 目录下的所有文件打包。而在发布和转移源码时我们可以打包除了 Temp 目录以外 “GMA” 目录下的所有文件和目录。如果不需要执行档,还可不包括 Bin 文件。 然而, VC 2008( VS 2008) 并不会自动为用户准备好上面的所有的配置,其中一些工作的需要用户修改项目的缺省设置来完成。 1) 使用 “/GMA/Temp/Compile/” 作为项目编译时使用的中间目录 2) 使用 “/GMA/Temp/Link/” 作为项目链接的输出目录 3) 当项目是应用程序时,在构建结束后拷贝执行文件到 “/GMA/Bin/Release/” 或 “/GMA/Bin/Debug/” ,当项目是动态链接库时,除了拷贝 dll 到 Bin ,还拷贝导入库到 “/GMA/Lib/” 4) 当项目是应用程序时,调试时运行 “/GMA/Bin/Debug/” 或 “/GMA/Bin/Release/” 下面的执行文件,并以 “/GMA/Bin/Debug/” 或 “/GMA/Bin/Release/” 为工作目录 3.2 开始两个项目配置属性设置 3.2.1 动态链接库项目 ChocolateMilk 配置属性 1) 使用 “/GMA/Temp/Compile/” 作为项目编译时使用的中间目录 2) 使用 “/GMA/Temp/Link/” 作为项目链接的输出目录 图 6 注意高亮的部分,首先将配置改成 All Configuration( 全部配置 ) ,这样可以让我们同时修改 Debug 和 Release 的部分; Output Directory ( 输出目录,链接器 ) 栏位填入: $(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName) Intermediate Directory ( 中间目录,编译器 ) 栏位填入: $(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName) 3) 默认设置的 dll 和 lib 生成文件为输出目录中,因此构建结束后拷贝动态链接库到 “/GMA/Bin/Release/” 或 “/GMA/Bin/Debug/” ,拷贝导入库到 “/GMA/Lib/” 。 我们通常都会在 Debug 版本的输出库后面加上字母 “d” 以表示这是 Debug 版本,在 Debug 配置下,修改 Import Library 属性为 $(TargetDir)$(TargetName)d.lib : 图 7 为了实现构建结束后动态链接库和导入库的拷贝, VC 可以让我们设置构建前后执行的脚本程序,需要我们写构建后执行的脚本: 图 8 由于 VC 中缺少表示导入库的系统变量值,所以在 Command Line 设置时需要分别设置 Debug 配置下: copy “$(TargetPath)” “$(SolutionDir)\Bin\$(ConfigurationName)\” ; copy “$(TargetDir)$(TargetName)d.lib” “$(SolutionDir)\Lib\” ; Release 配置下: copy “$(TargetPath)” “$(SolutionDir)\Bin\$(ConfigurationName)\” ; copy “$(TargetDir)$(TargetName).lib” “$(SolutionDir)\Lib\” ; 3.2.2 应用程序项目 PureMilk 配置属性 1) 使用 “/GMA/Temp/Compile/” 作为项目编译时使用的中间目录 2) 使用 “/GMA/Temp/Link/” 作为项目链接的输出目录 将配置改成 All Configuration ,这样可以让我们同时修改 Debug 和 Release 的部分; OutputDirectory( 输出目录,链接器 ) 栏位填入: $(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName) IntermediateDirectory( 中间目录,编译器 ) 栏位填入: $(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName) 3) 构建结束后拷贝执行文件到 “/GMA/Bin/Release/” 或 “/GMA/Bin/Debug/” 在 Command Line 中填入, All 配置下: copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName); 4) 调试时运行 “/GMA/Bin/Debug/” 或 “/GMA/Bin/Release/” 下面的执行文件,并以 “/GMA/Bin/Debug/” 或 “/GMA/Bin/Release/” 为工作目录 图 9 Command 栏填入: $(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName) WorkingDirectory 栏填入: $(SolutionDir)\Bin\$(ConfigurationName)\
16361 次阅读|0 个评论
Matlab变量编辑器中的矩阵元素闪烁,菜单无法使用
opensesame 2014-4-14 01:03
为了处理更大的矩阵,提高海洋模式的分辨率,半年前开始使用M-a-t-l-a-b 2009b 64位和win 7 64位系统。首先解决了该系统下NetCDF文件的处理问题。虽然已经有内置函数支持NetCDF,但是我之前写的、用的很多程序都是用mexcdf和netcdf-matlab两个软件包处理的,为了兼容以前的工作,必须让新版的软件支持以前的NetCDF工具包。好在问题都解决了。新软件和旧程序的兼容性一直是个很大的问题,这也是我对于更新软件和系统比较犹豫的原因。 最近有遇到了新的问题,其实发现很久了。一直在google中搜索不到问题的答案。这一次,偶然发现有个方法可以暂时解决问题。 问题:M-a-t-l-a-b的 变量编辑器( VariableEditor )中打开的矩阵变量后,移动滑动条之后,矩阵中的有几行元素一直保持闪烁;同时 Editor 的菜单也在晃动,无法定位或者点击选中其中的 菜单项。譬如,以往正常时,选中打开的矩阵中的一列数据,点击菜单中画图的符号就可以直接画出图,现在根本没法用了。 起初,以为是内容不够。系统内存8G。我以为mat-lab能调用的内容太少,就创建并修改了c:\MATLAB\R2009b\bin\win64\java.opts,把其中的可调用内容提高。可是,没有效果。 偶然发现,以下两个方法有效: 方法一:下载了一个 Microsoft visual studio 2008 sp1 的升级包(不是visual studio本身,才几百k),点击之后,提示本机没有安装 visualstudio 2008 。确定、然后退出。然后,再使用 Matlab 的变量编辑器,矩阵元素不再闪烁了,它的菜单也可以用了。奇怪!!! Visual studio2008 升级包的名称: VS90sp1-KB945140-CHS.exe,可从微软网站免费下载。 这个方法在系统重启之后就会失效。重启之后,需要重新双击 VS90sp1-KB945140-CHS.exe 。 方法二:在另一台有同样问题的台式机( win xp 64 位,缅因大学学校电脑,其中用的也是matlab2009b)上安装了微软的 .Net Framework 之后,上述问题也解决了。文件名称 dotNetFx40_Full_setup.exe 。但是,目前不知道系统重启之后是否会失效。 其中的道理还没有明白。真是无心插柳柳成荫!了解道理的大侠们能否提示一二?
个人分类: 软件技巧|4578 次阅读|0 个评论
怎样在Microsoft Visual Studio 2013 中建立一个工程(Project)
bigdataage 2014-3-26 00:13
怎样在Microsoft Visual Studio 2013 中建立一个工程(Project) 以 Microsoft Visual Studio Ultimate 2013(英文旗舰版) 中建立 C语言的 Project 为例: FILE - New - Project - Visual C++ - Win32 Console Application - 输入名字 - OK - Next -勾选 Empty project - Finish 在Solution Explorer区域,右击Source Files: Add - New Item - Visual C++ - C++ File (.cpp) -输入名字(C源代码的后缀必须为.c,不能为.cpp) - Add 这样就可以输入代码了。 编译: BUILD - Compile 或 Ctrl + F7 运行: DEBUG - Start Without Debugging 或 Ctrl + F5 步骤如下面几幅图所示:
8089 次阅读|0 个评论
[转载]Visual Insights:A Practical Guide to Making Sense of Data
rbwxy197301 2014-1-23 11:42
Visual Insights: A Practical Guide to MakingSense of Data Introduction This textbookoffers a gentle introduction to the design of insightful visualizations. Itseamlessly blends theory and practice, giving readers both the theoreticalfoundation and the practical skills necessary to render data into insights. The firstchapter introduces a theoretical framework that covers temporal, geospatial,topical, and network data analyses and visualizations. It is followed bychapters that detail visualizations and workflows that aim to answer “when”(temporal data), “where” (geospatial data), “what” (topical data), and “withwhom” (trees and networks) questions. The design and deployment of interactiveonline visualizations is discussed. Each chapter has a hands-on part thatdemonstrates how plug-and-play macroscope tools can be used to run advanceddata mining and visualization algorithms. The final two chapters presentexemplary case studies and discuss future developments. The bookaccompanies the Information Visualization MOOC that attracted students,scholars, and practitioners from many fields of science and more than 100different countries. Quotes byExperts “In the world ofvisualization and information graphics, the bibliography about thematic mapsand statistical graphs is becoming abundant, little by little. However, studiesof how to design network diagrams and conceptual maps are rare, and usuallyavailable only through scientific publications. Katy Börner’s and DavidPolley’s book is the first serious attempt at offering a theoretical andpractical introduction to this discipline, aimed not just at specialists but atany reader, regardless of her or his background. I foresee that it’ll becomethe textbook of choice for many instructors.” —Alberto Cairo,Professor of the Professional Practice at the School of Communication of theUniversity of Miami and author of The Functional Art: an Introduction toInformation Graphics and Visualization “A goodvisualization is never easy-beesy done; good visualization is a science, acraft, and an art at once. If you want to become a visual data explorer andlearn to produce meaningful visualizations, this book is a good guide for sucha journey. It is a must-read for students at iSchools and those in the DigitalHumanities, and a recommendation for inhabitants of the variousinterdisciplinary valleys in the science landscape.” —AndreaScharnhorst, Head of Research at Data Archiving and Networked Services andmember of the e-humanities group at the Royal Netherlands Academy of Arts andSciences in Amsterdam, Netherlands. “In this age ofknowledge abundance, policymakers and the public need to quickly understandcomplex information, and this book takes a giant leap forward in this arena.The knowledge system has become a global enterprise, and it is one thatinvolves collaboration and interdisciplinary linkages. These trans-boundarylinks require new metrics and the use of new methods of examination and explanation.Katy Börner’s and David Polley’s book creates a map into the new knowledgeterrain that we will all be transiting soon.” —Caroline S.Wagner, Milton and Roslyn Wolf Chair in International Affairs; Director,Battelle Center for Science Technology Policy, John Glenn School ofPublic Affairs, Ohio State University “Following inthe footsteps of the richly illustrated and highly informative book “The Atlasof Science: Visualizing What We Know”, Professor Katy Borner’s new book VisualInsights: A practical Guide to Making Sense of Data brings theory and practicein seven manageable chapters to both new initiate and engaged user, giving aninsightful overview of the field, and making accessible the methods andtechniques to empower the reader to become a visualization practitioner.” —George Legrady,Director of the Experimental Visualization Lab and Chair of the Media Arts Technology doctoral program at the University of California, SantaBarbara (以上内容:摘自:http://cns.iu.edu/ivmoocbook14.html) Product Details Paperback: 312 pages Publisher: The MIT Press (January 24, 2014) Language: English ISBN-10: 0262526190 ISBN-13: 978-0262526197 Product Dimensions: 9 x 7.5 x 0.6 inches Shipping Weight: 1.5 pounds ( View shipping rates and policies ) ( http://www.amazon.com/Visual-Insights-Practical-Guide-Making/dp/0262526190)
个人分类: 文章转载|2621 次阅读|0 个评论
visual studio 2010
xiaoxinghe 2013-7-19 16:33
microsoft visual studio 2010 旗舰版的产品密钥 YCFHQ-9DWCY-DKV88-T2TMH-G7BHP 进入Visual Studio 开发环境点工具-导入和导出设置 选择 重置所有设置 然后关闭重新启动Visual Studio 会让你选择默认环境(就跟第一次启动Visual Studio 一样)
个人分类: C #|2217 次阅读|0 个评论
visual studio 2012 项目属性 无法打开,弹出错误提示:未将对象
baibing 2013-1-13 18:01
在Visualstudio2012中,我想修改项目的包含路径和库路径,于是打开项目-属性,然后点击左侧的“VC++目录”,就弹出提示: “未将对象的引用设置到对象的实例”, 若有高手可以恢复一下怎么回事。 不过,从 视图- 属性管理器 的 Microsoft.Cpp.Win32.user 中进入“VC++目录”,从而达到我们修改其包含和库目录的目的。 这个道理在下面的 转载文章中有所介绍。 在VisualStudio2010中配置VC++目录 http://blog.sina.com.cn/s/blog_72824f680100ps4c.html VS 2010在“工具-选项-项目和解决方案-VC++ 目录”的功能已经被否决,不再提供设置,如下图: IMG title="在VisualStudio2010中配置VC++目录" name=image_operate_19001295597286724 alt="在VisualStudio2010中配置VC++目录" src="http://s4.sinaimg.cn/middle/72824f68t9a568278ad33690" action-type="show-slide" action-data="http%3A%2F%2Fs4.sinaimg.cn%2Fmiddle%2F72824f68t9a568278ad33%26690" real_src="http://s4.sinaimg.cn/middle/72824f68t9a568278ad33690" 但是每个工程都要在“项目-属性-配置属性-VC++ 目录”中一一设置如OpenCV之类的公共库文件目录是件很麻烦的事,如何解决呢? 方案一: 1、先打开任意一个VC项目,再打开VS2010的属性管理器(视图-其他窗口- 属性管理器 ),如下图。 IMG title="在VisualStudio2010中配置VC++目录" name=image_operate_57301295596888892 alt="在VisualStudio2010中配置VC++目录" src="http://s6.sinaimg.cn/middle/72824f68t9a568ea5d085690" width=248 height=292 real_src="http://s6.sinaimg.cn/middle/72824f68t9a568ea5d085690" 双击任意“Microsoft.Cpp.Win32.user”,弹出属性页,在里面设置VC++目录即可。这样,该设置对所有VC项目都有效,见下图。 IMG title="在VisualStudio2010中配置VC++目录" name=image_operate_12331295597279011 alt="在VisualStudio2010中配置VC++目录" src="http://s10.sinaimg.cn/middle/72824f68t9a56a942ae99690" width=690 height=494 action-type="show-slide" action-data="http%3A%2F%2Fs10.sinaimg.cn%2Fmiddle%2F72824f68t9a56a942ae99%26690" real_src="http://s10.sinaimg.cn/middle/72824f68t9a56a942ae99690" 其实这种方法修改的结果会保存到%USERPROFILE%\appdata\local\microsoft\msbuild\v4.0下面的文件: Microsoft.Cpp.Win32.user.props。如果是64平台则是反应到Microsoft.Cpp.X64.user.props文件中。这两个文件都是在安装VS2010时产生的。所以很容易想到方案二了。 方案二: 1、定位到 %USERPROFILE%\appdata\local\microsoft\msbuild\v4.0(可以通过运行,或直接在windows资源管理器的地址栏中输入)。 2、使用词本或其他文本编辑工具修改 Microsoft.Cpp.Win32.user.props或Microsoft.Cpp.X64.user.props文件中的相关字段。
8410 次阅读|0 个评论
Visual Studio 2012 中使用环境变量
baibing 2013-1-11 22:33
Visual  Studio 2012 中使用环境变量
Visual Studio 2012 中 已经不再像vs6.0 那样,提供针对整个个workspace的 include、 lib 等目录设置了。 而每一个项目都要设置针对自己的 这些目录,并且这是通过引用环境变量的方式方便设置的。 环境变量就是操作系统的那个环境变量,代表的是一系列的目录。在VS2012中进行目录设置时可以直接引用。 用户可以在项目配置中 如 Include为例,直接输入 引用的环境变量; 点击进入 编辑后,再点击宏,可以见到下图,底面用户可以在已有的环境变量库中搜索是否已有可用的环境变量。可以添加到上面的空白中。
1 次阅读|0 个评论
visual studio Ultimate 2012 安装
baibing 2013-1-10 17:06
1、安装 安装后,按照要求,重新启动,总是弹出 Cannot find one or more components,。。。 从而无法启动。 重装了3次,问题竟然又没有了。不知什么原因。 这是遇到的第一个问题。 第二个问题,编译出错,提示缺少文件。使用Appwizard生成的程序编译连接也出错,解决方法见2: 另一个问题是,以上只是配置项目,如何将include 和lib一劳永逸设置?? 参考3、 为Visual Studio添加默认INCLUDE包含路径一劳永逸的方法(更新) 2、 fatal error C1083: 无法打开包括文件:“SDKDDKVer.h” http://www.global-webnet.com/Blog/post/2012/04/14/Kinect-SkeletalViewer-Cannot-open-include-file-SDKDDKVerh-No-such-file-or-directory.aspx The solution is 3 easy steps... While evaluating C++ development for the Kinect (for my http://SolrContrib.CodePlex.com project) I ran into issues compiling the newly installed project from the Sample (on a fresh install of Windows 8 and Visual Studio 2011). In the end I found that "the juice wasn't worth the squeeze"; the C# demos performed just as well as the C++ demos(in the same task that will meet my concerns) with a fraction of the coding (and learning curve). Binging a solution wasn't productive - I am a C# developer (with no understanding of the C++ environment) trying to compile a project under Windows 8 using Visual Studio 2011. I learned early thatwhen you liveon the bleeding edge that sometimes youhave to bleed, I was hemorrhaging. I did however find an excellent clue within the VS11: C++ include directories not set correctly in new project bug reported on the Microsoft site. There was enough information to let me know that I required a "Windows Kits" folder (WindowsSdkDir) which will hold the SDKDDKVer.h. Long story short the Bing trail took me to the following: Windows Driver Kit (WDK) 8 Consumer Preview: http://msdn.microsoft.com/en-us/windows/hardware/hh852362 Step #1 - Download and install this development kit,I wasn't trying to create Windows Drivers, however I felt it was safe to assume it would have everything Windows Drivers developers required to compile their C++ applications. The assumption paid off; afterI installed it, along withthe Windows Driver Frameworks (WDF) Co-Installers it will recommend that you install, the folders were now available! But I was still not compiling! I went back to bug report and like Jennifer I did not have the required "/shared" folder in the Include directories path (which she manually added). HOWEVER, I did note a checkbox setting inherit from parent or project defaults as I stumbled around trying to find "HOW"includes worked in thisenvironment(using the following steps): Step #2 - comply with the following steps Right click on SkeletalViewer Project Select Properties Open Configuration Properties (ref SkeletalViewer Property Pages in image below) Selected VC++ Directories (not shown in image) Select Include Directories (shown in image below) Click the dropdown box (down arrow icon) that will appear to right of input field Select Edit (you will see Include Directories windows shown in image below) Click the Macros button and scroll down to the WindowsSDK_Include path (shown below) I saw how the $(WindowsSDK_includePath), included with "Inherited values", contained my /Shared folder!!! I clicked the Checkbox Inherit from parent or project defaults, exited all windows applying updates as applicable. I Hit compile and I got another error - this time for a .lib file (can't recall what it was). 白冰做法:WDK是默认安装在C:\Program Files\Windows Kits中,具体将C:\Program Files (x86)\Windows Kits\8.0\Include - shared - um - winrt 三个目录包含到项目中。 这也可以直接通过在项目设置中添加引用这个$(WindowsSDK_includePath) 变量来实现,这个环境变量已经存在了,可以在宏中查到。 Step #3 - I followed the same steps from 5 on for the Library Directories path. 白冰做法:将C:\Program Files\Windows Kits\8.0\Lib\win7\km\x86 包含到 这个项目中。 这里也可以建立和引用环境变量的方式:可是如何在visual studio中为自己的工程添加环境变量?参见4 I Hit compile and Walla! I can compile and run the KinectViewer application! 3、 为Visual Studio添加默认INCLUDE包含路径一劳永逸的方法(更新) 你是否曾经也有过这样的问题: 用VS的时候,有时会用到一些非自带的库,例如WTL、Boost、DX等,每次需要用到时都要在项目属性里添加相应的include目录,久而久之觉得有点麻烦。是否有解决办法呢? 于是我便在网上找相关资料,在StackOverflow网站上找到一篇相关的文章( 原文链接 ),文章里提到的一个办法是修改 C:\Users\user\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props 这个文件,在这个文件里添加需要include的目录,之前我一直是用这个方法,也没啥问题。 当我安装了VS2012之后,问题变出现了。在VS2012上新建一个MFC的工程,什么也没动,居然编译不通过,提示找不到某些文件,我便联想到了是不是之前修改了影响到了,于是我果断把修改的那个文件恢复成默认的内容,再试,结果就没问题了。。。可是这样就得每次都手动添加WTL的目录了。。我便开始翻VS的一些配置文件。 解决方案一: 修改 " VS安装目录中的\VC\VCWizards\default.vcxproj " 这个文件,(这其实就是个xml文件) 如我的目录是" D:\Program Files\Microsoft Visual Studio 11.0\VC\VCWizards\default.vcxproj " 如果我要添加的目录是" D:\Program Files\Microsoft Visual Studio 11.0\VC\WTL\include "; 用文本编辑器打开这个文件,定位到文件末尾,在 /Project 之前插入如下内容 PropertyGroup IncludePath $(VCInstallDir)\WTL\include;$(IncludePath) / IncludePath / PropertyGroup $(VCInstallDir)\WTL\include; 就是需要添加的目录了。 $(VCInstallDir) 是VS里的环境变量(在我的电脑上就是" D:\Program Files\Microsoft Visual Studio 11.0\VC "),表示VC的安装目录。 $(IncludePath) 是表示原有的路径。实际上最终得到的路径如图里四个 如果需要添加lib文件的路径的话。格式就是 LibraryPath/LibraryPath 添加完后保存即可,新建一个项目后,在项目属性里可以看到目录已经加进去了。大功告成,VS2010也是用同样的方法,只不过目录不同了。 解决方案二: 这个方法是结合了开头提到的StackOverflow网站上的修改方法。 依然是修改 " VS安装目录中的\VC\VCWizards\default.vcxproj " 这个文件,只不过这里修改的地方不同,用文本编辑器打开该文件,查找" $(UserRootDir)\Microsoft.Cpp.$(Platform).user.props "这段内容, 其实这里就是指向了我电脑上的那个文件 C:\Users\HwangBae\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props ;这里我就想到了,为VS2010和VS2012指定不同的文件, 将" $(UserRootDir)\Microsoft.Cpp.$(Platform).user.props "全部替换成" $(UserRootDir)\ VC11\ Microsoft.Cpp.$(Platform).user.props "。 然后在 C:\Users\HwangBae\AppData\Local\Microsoft\MSBuild\v4.0 这个目录下创建了两个文件夹,分别命名为VC10和VC11,然后将 Microsoft.Cpp.Win32.user.props 复制到这两个文件夹,然后除了这两个文件夹外的文件均可删除,其他的文件VS会在那两个文件夹里自动重新创建的; 然后编辑 Microsoft.Cpp.Win32.user.props 这个文件,在 Project 节点下按照方法一的步骤插入同样的代码。在VS2010的目录下也做同样的替换。到此就完事了。测试无任何问题。 总结一下这两种方法的区别,方法一修改后,只对新建的项目有效,在没修改之前创建的项目是无效的,而方法对于之前创建的项目也有效。哪种方法比较适合大家自己取舍。 转载请标明出处,原文地址: http://www.cnblogs.com/hwangbae/archive/2012/06/24/2560463.html 如果觉得本文对您有帮助,请支持一下,您的支持是我写作最大的动力,谢谢。 4、 可是 如何在visual studio中为自己的工程添加环境变量 ? 右击"我的电脑"--选择"属性"---选择"高级"--选择"环境变量"--就可以新建自己的环境变量名了 如: 变量名:MicrosoftSDKDir 变量值:C:\ProgramFiles\MicrosoftSDKs\ 如果要设置目录 C:\ProgramFiles\MicrosoftSDKs\Windows\v6.0\Include 以后就可以在VC中设置目录的时候可以(设置default.vcxproj中的 LibraryPath/LibraryPath ) $(MicrosoftSDKDir)Include 了 5、 WTL for Visual Studio 2012 配置详解 学习WTL有一段时间了,因前段时间去参加国赛耽搁几周,回来之后便继续学习,一直对VS2012有爱的我便想在12上面写WTL,上WTL的SVN看到,已经添加了对VS11 beta的支持,其实11就是2012。。于是我便down下来。 网上搜集了一些WTL环境的配置的资料,都写得不错,我在这里做更详细的补充。 Step1: 从WTL的SVN上获取所需的文件,这里需要两份文件 WTL include文件 http://wtl.svn.sourceforge.net/viewvc/wtl/trunk/wtl/include/?view=tar WTL wizard文件 http://wtl.svn.sourceforge.net/viewvc/wtl/trunk/wtl/Wizards/AppWiz/?view=tar 上面提供的仅是Win32所需要的文件,如果需要WTL的其他资源或整个项目,请访问下面的链接 http://wtl.svn.sourceforge.net/viewvc/wtl/?view=tar (以上链接请直接在浏览器打开,勿使用迅雷之类的工具下载) 下载下来是tar.gz的压缩包 可以使用WinRar或者7z之类的软件解压,我这里用WinRar,解压出来后得到两个文件夹 AppWiz就是将WTL添加到VS创建向导里的一些文件,include就是WTL的头文件。 在AppWiz文件里,有一个Files文件夹和多个setupxx.js文件 这些js脚本文件可以帮你将向导文件添加到VS的目录里,不同版本的VS对应不同的js文件 ,例如VS2012就是setup110.js (带x表示Express版本),这里我为了方便管理,需要做出一些修改; 找到" VS安装目录\VC\VCWizards\AppWiz "这个目录,如我电脑上就是" D:\Program Files\Microsoft Visual Studio 11.0\VC\VCWizards\AppWiz ", 在这个目录下新建一个 WTL 文件夹,然后将 Files 文件夹和 setup110.js 移动到WTL文件夹下。 然后将 Files 文件夹重命名为 Application ,然后用记事本编辑 setup110.js ,定位到第60行。 将 var strSourceFolder = FileSys.BuildPath(strValue, "Files"); 修改成 var strSourceFolder = FileSys.BuildPath(strValue, "Application"); 然后打开cmd,执行如下代码 wscript //e :jscript "D:\Program Files\Microsoft Visual Studio 11.0\VC\VCWizards\AppWiz\WTL\setup110.js" 执行完会提示应用程序向导安装成功。 这里再说下另一种方法,先不将Files改为Application,js文件也不修改,直接在cmd里执行安装,安装完后,将Files修改为Application,然后找到 D:\Program Files\Microsoft Visual Studio 11.0\VC\vcprojects\WTLAppWiz.vsz 这个文件,用记事本打开该文件 将第六行 Param="ABSOLUTE_PATH = D:\Program Files\Microsoft Visual Studio 11.0\VC\VCWizards\AppWiz\WTL\Files" 改成 Param="ABSOLUTE_PATH = D:\Program Files\Microsoft Visual Studio 11.0\VC\VCWizards\AppWiz\WTL\Application" 其实吧,不改也是没啥影响,只不过我比较蛋疼。。。。 到这里就完成了向导的添加,如果有洁癖可以把js文件删除掉了。 Step2: 添加WTL的头文件,解压出来的include文件夹下有这些头文件 我的做法是在 D:\Program Files\Microsoft Visual Studio 11.0\VC 下创建了一个WTL文件夹,将include文件夹放进WTL。(也可以放其他目录,配置include目录时改下即可) include目录的添加请参考我的另一片文章 为Visual Studio添加默认INCLUDE包含路径一劳永逸的方法 http://www.cnblogs.com/hwangbae/archive/2012/06/24/2560463.html 由于VFC还未更新对VS2012的支持,我这里就不写VFC的配置了。 如果配置的过程中遇到了问题,欢迎在博客留言讨论或者Email我。 欢迎转载本文章,但请标明出处,原文地址: http://www.cnblogs.com/hwangbae/archive/2012/06/27/2565591.html 如果觉得本文对您有帮助,请支持一下,您的支持是我写作最大的动力,谢谢。 FAQ A: 在cmd里执行js脚本时出现错误: 没有文件扩展 “.js” 的脚本引擎。 怎么解决: Q: 打开注册表编辑器,定位到HKEY_CLASSES_ROOT\.js,将默认值改成JSFILE。
个人分类: 编程|106 次阅读|0 个评论
Microsoft visual studio 2008 + Intel.Visual.Fortran.Compiler
yaozhixiong 2013-1-2 11:41
Microsoft visual studio 2008 Intel.Visual.Fortran.Compiler.Professional.v11.0.061 试试这个来编程
个人分类: fortran|3890 次阅读|0 个评论
[转载]visual c++6.0编译xvid
grapeson 2012-12-7 09:20
看了很多人的博客,觉得不是很详细,所以自己总结一下用的笔记与大家分享一下,共同学习 搭建xvid环境: 一、如果你的VC6.0是sp6版本以下的 1.下载vc6.0SP5的升级包,支持SSE汇编指令安装vcpp5.exe时要它,从以下网址下载: http://download.microsoft.com/download/vstudio60ent/SP5/Wideband-Full/WIN98Me/EN-US/VS6sp5.exe 安装方法: a.直接单击Vs6sp5.exe,点击运行,选泽一个文件夹(如vcsp5)存放它解压出来的文件 b.在vcsp5文件下找到setupsp5.exe,点击后会自动安装,就OK了。 2.vc6.0默认情况下并不支持MMX/SSE等嵌入指令,所以要下载vcpp5.exe让其支持 二、如果你的VC6.0是sp6版本则可跳过1和2,但要做以下修改: a. xvidcore-1.1.3/src目录下的portab.h把#define uint64_t unsigned __int64去掉unsigned b. xvidcore-1.1.3/vfw/src目录下status.h把#define uint64_t unsigned __int64去掉unsigned 3.编译xvid开源代码(以xvid-1.1.3为例) 注:版本可以在xvid.h头文件下查 1.编译xvid要用到汇编,所以要再装汇编器如NASM-2.07-installer.rar,安装后把nasm.exe和ndisasm.exe拷贝到vc98/bin目录下,这样可 省第2步 2.打开空工程的VC,“tools—options——directories下的show directories for下的 Executable files”添加nasm的安装路径即可 如图(上传不 了图片) 3.xvid-1.1.3允许生成静态链接库libxvidcoe.lib或动态链接库xvidcore.dll。 在xvidcore-1.1.3/build/win32目录下的xvidcore.dsw 生成动态 链接库 在xvidcore-1.1.3/build/win32目录下的libxvidcore_static.dsp生成静态链接库 4.编译xvidcore-1.1.3/vfw下的vfw.dsw生成xvidvfw.dll和xvid.inf 5.编译xvidcore-1.1.3/dshow下的dshow.dsp生成xvid.ax, 不过在此之前要 安装directX建议使用directx9.0b,因为他包含有 directshow。最后也要链接其安装路径如: a.Include files(添加在最前面) D:/DXSDK/Include D:/DXSDK/Samples/C++/DirectShow/BaseClasses D:/Program Files/Microsoft Platform SDK for Windows XP SP2/Include b.Library files(添加在最前面) D:/DXSDK/Lib D:/DXSDK/Samples/C++/DirectShow/BaseClasses/lib 6.右键xvid.inf安装xvid 7.把要用到的.dll拷贝到自己的工程文件或者.lib到vc98/lib 8. 这样就OK了。。
2152 次阅读|0 个评论
Visual Basic与图像处理24
热度 1 prrsw 2012-10-14 16:45
Visual Basic与图像处理24
Visual Basic 与图像处理(三) 9 、 Laplacian 微分算子 前面讲的几种都是一阶微分算子,本节开始讲的是二阶微分算子,从理论上来说二阶微分算子比一阶微分算子更为敏感,因此能够提取到更多的细节信息。二阶微分算子中最常用也最简单的就是拉普拉斯( Laplacian )微分算子,可以用下面的公式进行表示: 上式也可以写成平时常见的模板形式: 本例的运行界面如下: Laplacian 滤波按钮对应的代码如下: Private Sub cmdLaplacianFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim Dx As Integer, Dy As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight - 2 ' 边界像素直接不要了 DestImWidth = SourceImWidth - 2 ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的 Laplacian 滤波 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x NGrayValue = Abs(4 * Temp(1, 1) - Temp(0, 1) - Temp(1, 0) - Temp(1, 2) - Temp(2, 1)) If NGrayValue 255 Then NGrayValue = 255 dbits(i - 1, j - 1, 0) = NGrayValue dbits(i - 1, j - 1, 1) = NGrayValue dbits(i - 1, j - 1, 2) = NGrayValue Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub 拉普拉斯算子还有许多变形形式,这里给出几种常用的变式: 由于拉普拉斯是一种微分算子,它的作用强调图像中的灰度等级的突变,在实际应用中可以将锐化结果叠加到原始图像中,这样既可以保护拉普拉斯锐化处理的效果,同时也能复原原始背景信息,用运算模板的形式表示如下: 这是的运行界面如下: 对比原图可以看出,经过这种方法强化的图像中,细节信息更为明显,上述织物图像表面纹理要比原图清晰得多。
3230 次阅读|2 个评论
Visual Basic与图像处理23
prrsw 2012-10-14 16:28
Visual Basic与图像处理23
Visual Basic 与图像处理 ( 三 ) 8 、 Priwitt 微分算子 Prewitt 微分算子的思路与 Sobel 微分算子的思路类似,也是在一个 3 × 3 模板下进行图像的锐化处理。 Prewitt 微分算子的定义如下: 上面的式子同样也可以用模板进行表示: Priwitt 微分算子与 Sobel 微分算子的模板基本一样,只是系数的微调,因此处理结果也基本一致,从肉眼很难看出明显的差别,本例的运行界面如下: Priwitt 滤波按钮对应的代码如下: Private Sub cmdPriwittFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim Dx As Integer, Dy As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight - 2 ' 边界像素直接不要了 DestImWidth = SourceImWidth - 2 ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的 Priwitt 滤波 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x Dx = -(Temp(0, 0) + Temp(0, 1) + Temp(0, 2)) + (Temp(2, 0) + Temp(2, 1) + Temp(2, 2)) Dy = -(Temp(0, 0) + Temp(1, 0) + Temp(2, 0)) + (Temp(0, 2) + Temp(1, 2) + Temp(2, 2)) NGrayValue = Sqr(Dx ^ 2 + Dy ^ 2) If NGrayValue 255 Then NGrayValue = 255 dbits(i - 1, j - 1, 0) = NGrayValue dbits(i - 1, j - 1, 1) = NGrayValue dbits(i - 1, j - 1, 2) = NGrayValue Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub
2566 次阅读|0 个评论
Visual Basic与图像处理22
prrsw 2012-10-14 16:15
Visual Basic与图像处理22
Visual Basic 与图像处理 ( 三 ) 7 、 Sobel 微分算子 Roberts 微分算法可以实现图像中细节轮廓信息的获取,但模板中只有 4 个像素点,计算机虽然小,但是作用范围也小。平时使用得更多的是 3 × 3 模板, Sobel 算子就是其中使用得最多的一种,与前面讲述的类似,首先用下面的公式进行微分算子的表示: 同样也可以利用模板表示上面的两个公式: Sobel 微分算子可以用下面的式子表示: 本例的运行界面如下: Sobel 滤波按钮对应的代码如下: Private Sub cmdSobelFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim Dx As Integer, Dy As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight - 2 ' 边界像素直接不要了 DestImWidth = SourceImWidth - 2 ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的 Sobel 滤波 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x Dx = -(Temp(0, 0) + Temp(0, 1) * 2 + Temp(0, 2)) + (Temp(2, 0) + Temp(2, 1) * 2 + Temp(2, 2)) Dy = -(Temp(0, 0) + Temp(1, 0) * 2 + Temp(2, 0)) + (Temp(0, 2) + Temp(1, 2) * 2 + Temp(2, 2)) NGrayValue = Sqr(Dx ^ 2 + Dy ^ 2) If NGrayValue 255 Then NGrayValue = 255 dbits(i - 1, j - 1, 0) = NGrayValue dbits(i - 1, j - 1, 1) = NGrayValue dbits(i - 1, j - 1, 2) = NGrayValue Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub
2956 次阅读|0 个评论
Visual Basic与图像处理21
prrsw 2012-10-14 15:59
Visual Basic与图像处理21
Visual Basic 与图像处理 ( 三 ) 6 、 Roberts 微分算子 前面介绍的两种微分算子,实际上是分别求出了水平和垂直方向上的细节信息。但在实际的图像处理之中,除了特殊用途之下才会使用到方向滤波,大部分二维图像处理时,需要同时获得两个方向上的细节信息,因此需要设计各向同性的微分算子用于图像的锐化处理。 Roberts 算子一种常用的微分算子,可以满足上述要求,其计算方法可以用下面的公式进行表示: 同样上面的公式可以用下面的两个模板进行表示: 本例的运行界面如下图所示: Roberts 滤波按钮对应的代码如下: Private Sub cmdRobertsFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(1, 1) As Integer Dim x As Integer, y As Integer Dim Dx As Integer, Dy As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight - 1 ' 边界像素直接不要了 DestImWidth = SourceImWidth - 1 ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的 Roberts 滤波 For i = 0 To SourceImHeight - 2 ' 边界像素不处理 For j = 0 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 1 For y = 0 To 1 r = sbits(i + x, j + y, 0) g = sbits(i + x, j + y, 1) b = sbits(i + x, j + y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x Dx = -Temp(0, 0) + Temp(1, 1) Dy = -Temp(0, 1) + Temp(1, 0) NGrayValue = Abs(Dx) + Abs(Dy) If NGrayValue 255 Then NGrayValue = 255 dbits(i, j, 0) = NGrayValue dbits(i, j, 1) = NGrayValue dbits(i, j, 2) = NGrayValue Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub
2735 次阅读|0 个评论
Visual Basic与图像处理20
prrsw 2012-10-14 15:35
Visual Basic与图像处理20
Visual Basic 与图像处理(三) 图像的锐化处理也是图像增强的一种方法,主要是为了突出图像中的部分细节或者增强被模糊了细节。从取样规律来说,在图像分辨率不足时,所获得的像素点可以认为是周围景物亮度的平均值,这种均值效率使得图像变得模糊,可以认为这种均值处理的方法与积分效应类似,与此相对,为了强化图像细节,可以对图像进行微分处理,后面介绍的锐化处理就可以看成为各种不同的微分算法。 从数学定义来看,微分的含义就是数据的变化率,由于图像是由离散的像素点表示的,因此图像的微分就是像素点的差值,称为差分。为了便于叙述,后文在不再区分微分和差分的概念。 5 、具有方向性的一阶微分算子 为了便于理解,首先从一些最简单的微分算子将其,这类一阶微分算法的最大特点就是可以获得图像中特定方向上的灰度变化情况,在特定的纹理分析、检测方法非常有效,有时会称为方向性锐化。 (1) 水平方向的微分算子 水平方向的微分算子就是为了获得图像在水平方向上的灰度变化率,对于像素点 f(x,y) ,水平算子的定义如下: 用前面讲述过的模板的概念,水平方向微分算法可以用下面的模板进行表示: 在实际运算中,可以对上述的计算结果取绝对值处理,以避免出现负值,本例的运行界面如下: 水平微分算子按钮对应代码如下: Private Sub cmdHonSharpFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight - 2 ' 边界像素直接不要了 DestImWidth = SourceImWidth - 2 ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的均值滤波直方图统计 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x NGrayValue = Abs(Temp(0, 0) + 2 * Temp(0, 1) + Temp(0, 2) - Temp(2, 0) - 2 * Temp(2, 1) - Temp(2, 2)) If NGrayValue 255 Then NGrayValue = 255 dbits(i - 1, j - 1, 0) = NGrayValue dbits(i - 1, j - 1, 1) = NGrayValue dbits(i - 1, j - 1, 2) = NGrayValue Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub 垂直方向滤波的方法与水平方向锐化滤波的方法基本一致,只是将模板修改如下: 垂直方向滤波的界面如下: 垂直锐化滤波按钮对应的代码如下: Private Sub cmdVSharpFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight - 2 ' 边界像素直接不要了 DestImWidth = SourceImWidth - 2 ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的垂直锐化滤波 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x NGrayValue = Abs(Temp(0, 0) + 2 * Temp(1, 0) + Temp(2, 0) - Temp(0, 2) - 2 * Temp(1, 2) - Temp(2, 2)) If NGrayValue 255 Then NGrayValue = 255 dbits(i - 1, j - 1, 0) = NGrayValue dbits(i - 1, j - 1, 1) = NGrayValue dbits(i - 1, j - 1, 2) = NGrayValue Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub
3176 次阅读|0 个评论
Visual Basic与图像处理19
prrsw 2012-10-12 14:47
Visual Basic与图像处理19
Visual Basic 与图像处理 ( 三 ) 4 、中值滤波 前面讲的均值滤波器等都是属于线性滤波器,容易带来图像细节的模糊,本节要讲的是一种非线性滤波器:中值滤波。中值滤波最早是有 J. W. Jukey 在 1971 年提出的一种一维信号处理技术,后来被拓展应用到二维图像处理技术之中。 所谓中值滤波,就是采用一个含有奇数个点的滑动窗口,将当前点灰度值(一般指窗口的中心点)用窗口中各点灰度值的中值来替代。由于一般采用的是奇数窗口,因此只要将各个像素点的灰度等级进行大小排序,中间的竖直就是中值;如果窗口是偶数(特殊情况)。就用排序后中间两个元素的均值来表示中值。 用前面均值滤波直接用线性方程来计算新的灰度值不一样的是,中值滤波首先要对当前窗口内的所有像素点的灰度值进行排序,一般有选择排序和冒泡排序两种方法,具体可参照相关的 Visual Basic 基础教程中的讲解,这里就不详细解释了。 中值滤波器窗口的形状有多种,有一维也有二维的,对于二维情况,中值滤波器的窗口形状和尺度对滤波结果影响也很大,因此需要根据实际的要求来选择滤波器的形状和尺寸。本例中示范一种最简单的 3 × 3 中值滤波,其余的情况读者可根据本例提供的相关代码适当修改得到,本例的运行界面如下: 3 × 3 中值滤波按钮对应的代码如下: Private Sub cmd33MedianFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim x As Integer, y As Integer Dim Temp(8) As Integer, TV As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的中值滤波 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x * 3 + y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x ' 选择排序 For x = 0 To 7 For y = x + 1 To 8 If Temp(x) Temp(y) Then TV = Temp(x) Temp(x) = Temp(y) Temp(y) = TV End If Next y Next x dbits(i, j, 0) = Temp(4) dbits(i, j, 1) = Temp(4) dbits(i, j, 2) = Temp(4) Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub
3578 次阅读|0 个评论
Visual Basic与图像处理18
prrsw 2012-10-12 09:33
Visual Basic与图像处理18
Visual Basic 与图像处理(三) 3 、特殊模板 有时候利用一些特殊的模板可以达到意外的效果,利用均值滤波类似的方法,只是改变模板就可能达到特殊的效果,这里以下面一个模板为例,可以达到边缘检测的效果: 下面是系统的 运行界面: 特殊模板按钮对应的代码如下: Private Sub cmdSpecialFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的特殊模板滤波 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x NGrayValue = Temp(0, 1) + Temp(1, 0) + Temp(2, 1) + Temp(1, 2) - 4 * Temp(1, 1) If NGrayValue 0 Then NGrayValue = 0 If NGrayValue 255 Then NGrayValue = 255 dbits(i, j, 0) = NGrayValue dbits(i, j, 1) = NGrayValue dbits(i, j, 2) = NGrayValue Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub
2636 次阅读|0 个评论
Visual Basic与图像处理17
prrsw 2012-10-12 08:17
Visual Basic与图像处理17
Visual Basic 与图像处理 ( 三 ) 2 、高斯滤波 高斯滤波与均值滤波方法接近,只是采用的模板不一样,均值滤波的模板中每个像素点权重是相等,而高斯滤波认为当前像素点的权重最大,距离越远的像素点在滤波结果中所占的权重越小,最常见的 3 × 3 高斯滤波器模板如下: 之所以称为高斯滤波,是因为上述模板是采样二维高斯函数得到的,下图就是 3 × 3 高斯滤波的运行界面: 3 × 3 高斯滤波按钮对应的代码如下: Private Sub cmd33GaussianFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的高斯滤波 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x NGrayValue = Temp(0, 0) + Temp(0, 1) * 2 + Temp(0, 2) + Temp(1, 0) * 2 + Temp(1, 1) * 4 + Temp(1, 2) * 2 + Temp(2, 0) + Temp(2, 1) * 2 + Temp(2, 2) dbits(i, j, 0) = NGrayValue / 16 dbits(i, j, 1) = NGrayValue / 16 dbits(i, j, 2) = NGrayValue / 16 Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub 5 × 5 高斯滤波器模板如下: 其滤波方法与前面介绍的方法一致,该部分运行界面如下: 5 × 5 高斯滤波按钮对应的代码如下: Private Sub cmd55GaussianFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(4, 4) As Integer Dim x As Integer, y As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的高斯滤波 For i = 2 To SourceImHeight - 3 ' 边界像素不处理 For j = 2 To SourceImWidth - 3 NGrayValue = 0 For x = 0 To 4 For y = 0 To 4 r = sbits(i + 2 - x, j + 2 - y, 0) g = sbits(i + 2 - x, j + 2 - y, 1) b = sbits(i + 2 - x, j + 2 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b Next y Next x NGrayValue = Temp(0, 0) + Temp(0, 1) * 2 + Temp(0, 2) * 4 + Temp(0, 3) * 2 + Temp(0, 4) ' 第一行 NGrayValue = NGrayValue + Temp(1, 0) * 2 + Temp(1, 1) * 4 + Temp(1, 2) * 8 + Temp(1, 3) * 4 + Temp(1, 4) * 2 ' 第二行 NGrayValue = NGrayValue + Temp(2, 0) * 4 + Temp(2, 1) * 8 + Temp(2, 2) * 16 + Temp(2, 3) * 8 + Temp(2, 4) * 4 ' 第三行 NGrayValue = NGrayValue + Temp(3, 0) * 2 + Temp(3, 1) * 4 + Temp(3, 2) * 8 + Temp(3, 3) * 4 + Temp(3, 4) * 2 ' 第四行 NGrayValue = NGrayValue + Temp(4, 0) + Temp(4, 1) * 2 + Temp(4, 2) * 4 + Temp(4, 3) * 2 + Temp(4, 4) ' 第五行 dbits(i, j, 0) = NGrayValue / 100 dbits(i, j, 1) = NGrayValue / 100 dbits(i, j, 2) = NGrayValue / 100 Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub
2881 次阅读|0 个评论
Visual Basic与图像处理16
热度 1 prrsw 2012-10-11 18:54
Visual Basic与图像处理16
Visual Basic 与图像处理 ( 三 ) 从本节开始介绍图像增强的知识,在图像的传送和转换,比如复制、扫描等过程中总要造成图像品质的下降,因此需要提供一定的方法对这些降质的图像进行改善处理。常用的一种方法就是将图像中感兴趣的特征进行选择性的突出,减弱次要信息,当然这种方法虽然能提高图像的可读性,但是改善后的图像不一定逼近原始图像,比如突出目标的轮廓、衰减图像的各种噪声,通常把这类方法称为图像增强技术。当然还有一类方法也能改善图像的质量,称为图像复原,这里先不进行阐述。 图像增强的方法通常可分为两大类,第一类就是在空间域内对图像的像素点灰度值直接进行处理,比如区域内进行均值、中值滤波;第二类方法是在频域内进行滤波,即将图像变换到频域,在频域内对图像进行某种运算增强,再变换回空间域,这部分内容在以后也会讲述到。本章讲述的是第一类方法。 1、 均值滤波 均值滤波是图像增强中最简单的一类,主要是为了减少图像中的噪声信号,常见的有 3 × 3 , 5 × 5 均值滤波,高斯模板滤波等,首先从最简单的 3 × 3 均值滤波开始讲起。 所谓 3 × 3 均值滤波就是将原图像中每个人像素点的灰度值与其八邻域的八个像素点的灰度值累加,将求得的平均值作为新图像中该像素点的均值,可以用下面的简单模板表示这种滤波方法: 均值滤波中要考虑的是边界像素的处理,最简单的一种处理方法是边界像素不作相应的处理,当然也有其他的处理方法,比如在图像周围补充一些像素,本例中采用边界像素直接复制的方法,系统的运行界面如下: 3 × 3 均值滤波按钮对应的代码如下: Private Sub cmdGrayEqua_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(2, 2) As Integer Dim x As Integer, y As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的均值滤波直方图统计 For i = 1 To SourceImHeight - 2 ' 边界像素不处理 For j = 1 To SourceImWidth - 2 NGrayValue = 0 For x = 0 To 2 For y = 0 To 2 r = sbits(i + 1 - x, j + 1 - y, 0) g = sbits(i + 1 - x, j + 1 - y, 1) b = sbits(i + 1 - x, j + 1 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b NGrayValue = NGrayValue + Temp(x, y) Next y Next x dbits(i, j, 0) = NGrayValue / 9 dbits(i, j, 1) = NGrayValue / 9 dbits(i, j, 2) = NGrayValue / 9 Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub 5 × 5 均值滤波方法与此类似,只是将模板扩大,改变其中的几句话即可,代码如下: Private Sub cmd55MeanFilter_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Temp(4, 4) As Integer Dim x As Integer, y As Integer Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 dbits = sbits ' 数组的直接复制,只有数组维数完全一样才可以 ' 图像的均值滤波直方图统计 For i = 2 To SourceImHeight - 3 ' 边界像素不处理 For j = 2 To SourceImWidth - 3 NGrayValue = 0 For x = 0 To 4 For y = 0 To 4 r = sbits(i + 2 - x, j + 2 - y, 0) g = sbits(i + 2 - x, j + 2 - y, 1) b = sbits(i + 2 - x, j + 2 - y, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 Temp(x, y) = 0.3 * r + 0.59 * g + 0.11 * b NGrayValue = NGrayValue + Temp(x, y) Next y Next x dbits(i, j, 0) = NGrayValue / 25 dbits(i, j, 1) = NGrayValue / 25 dbits(i, j, 2) = NGrayValue / 25 Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub 对应的软件运行界面如下: 从上述两个图可以看出,无论是 3 × 3 均值滤波,还是 5 × 5 均值滤波,都在一定程度上使得图像变得模糊,也就是说在滤除噪声信号的同时,也损失了图像的部分细节信号。
2880 次阅读|1 个评论
Visual Basic与图像处理15
prrsw 2012-10-11 16:12
Visual Basic 与图像处理(三) 通过动态数组减少 Point 方法的使用次数,可以有效的提高图像处理的速度, C 系列语言之所以在处理图像的时候速度较快,其实很大原因就是因为是从内存中直接读取图像数据。如果能完全放弃使用 Point 和 PSet 方法,直接获得图像数据,那么 Visual Basic 与 C 系列语言处理图像的速度并无明显差异,一种方法是直接读取文件的方法,对于初学者,还是不建议使用,因此没有必要,如果需要可以直接参考文件读取和写入的方法即可。这里推荐一种通过 API 函数直接完成图像读写的方法,主要涉及这样几个 API 函数: (1) 从 PictureBox 读入图像数据到数组中,用于取代 Point 方法。 Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long (2) 将数组数据直接映射到 PictureBox 中,用于取代 PSet 方法。 Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long (3) 获得控件句柄 Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long 为了便于对图像进行操作,自定义了一个数据类型 BIPMAP ,定义如下: Type BITMAP bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type 上述 API 函数定义和自定义变量都放置于标准模块之中。 在获取图像数据时,首先定义一个整型变量用于存放 PictureBox 中的图像句柄,然后调用 GetBitmapBits 函数获取图像数据,存放于数组中,需要注意的时, Visual Basic 获得的数据都默认为彩色图像,因此定义数组大小时,需要按照真彩色图像进行处理。将读取图像按钮代码做调整,使得读入图像的同时就获得图像数据,代码调整如下: Private Sub cmdReadImage_Click() Dim strFileName As String CDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" ' 文件过滤,可以打开上述三类图像 CDialog1.ShowOpen If CDialog1.FileName "" Then strFileName = CDialog1.FileName PicSource.Picture = LoadPicture(strFileName) End If SourceImHeight = PicSource.Height SourceImWidth = PicSource.Width Dim tSBmpInfo As BITMAP Dim hSrcBmp As Long Dim x As Integer, y As Integer hSrcBmp = PicSource.Image.Handle ' 注意,这里只能使用 image ,而不能使用 picture ' 获得位图信息 Call GetObject(hSrcBmp, Len(tSBmpInfo), tSBmpInfo) ReDim ImageArray(1 To tSBmpInfo.bmWidthBytes, 1 To SourceImHeight) As Byte ' 获得源图与目标图二进制位 Call GetBitmapBits(hSrcBmp, tSBmpInfo.bmWidthBytes * tSBmpInfo.bmHeight, ImageArray(1, 1)) ' 注意起点是 (1,1) ReDim sbits(SourceImHeight - 1, SourceImWidth - 1, 2) As Byte ' 通过下面的转换,将数组转置为习惯的格式,当然也可以不转置,只是后面使用起来比较麻烦 For y = 1 To SourceImHeight For x = 1 To SourceImWidth sbits(y - 1, x - 1, 2) = ImageArray((x - 1) * 4 + 1, y) sbits(y - 1, x - 1, 1) = ImageArray((x - 1) * 4 + 2, y) sbits(y - 1, x - 1, 0) = ImageArray((x - 1) * 4 + 3, y) Next x Next y End Sub 在处理程序时,同样定义动态数组用于存储目标图像数据,处理完成后再利用 SetBitmapBits 一次性将数组显示于目标的 PictureBox 控件之中,同样以直方图均衡化为例,对应的“直方图均衡化按钮代码调整如下: Private Sub cmdGrayEqua_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Hist(255) As Long ' 存放原直方图统计结果 Dim P(255) As Single ' 存放原直方图概率 Dim PA(255) As Single ' 存放原直方图累计分布概率 Dim Map(255) As Single ' 存放灰度等级映射结果 Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte ' 重新定义目标数组的维数 ' 图像的直方图统计 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 r = sbits(i, j, 0) g = sbits(i, j, 1) b = sbits(i, j, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b Hist(GrayValue) = Hist(GrayValue) + 1 Next j Next i P(0) = Hist(0) / SourceImHeight / SourceImWidth Map(0) = 255 * P(0) For i = 1 To 255 P(i) = P(i - 1) + Hist(i) / SourceImHeight / SourceImWidth Map(i) = 255 * P(i) Next i ' 图像的直方图均衡化 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 r = sbits(i, j, 0) g = sbits(i, j, 1) b = sbits(i, j, 2) ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b dbits(i, j, 0) = Map(GrayValue) dbits(i, j, 1) = Map(GrayValue) dbits(i, j, 2) = Map(GrayValue) Next j Next i Dim tDBmpInfo As BITMAP Dim hDestBmp As Long hDestBmp = PicDest.Image.Handle ' 获得位图信息 Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo) ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte For i = 1 To DestImHeight For j = 1 To DestImWidth ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2) ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1) ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0) Next j Next i ' 获得源图与目标图二进制位 Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1)) End Sub 初学者可能觉得本例比较复杂,一下子跳跃的跨度较大,但只要熟悉下来,流程还是基本一致的,后面在做一些实例时,可能感觉更为明显。前面在做点运算时,每次计算只需要使用到一个点,本章开始讲述图像的增强,一般需要同时涉及到多个像素点,这里提出的数组存储数据的方法也便于这样的操作。 通过比对可以发现,采用本例的方法以后, Visual Basic 处理图像的速度就跟平时见到的 C 系列语言处理的图像的速度基本一致,如果想要进一步提高处理速度,就需要研究算法方面的内容,这个就不在这里进行讨论了。
2760 次阅读|0 个评论
Visual Basic与图像处理14
prrsw 2012-10-11 15:15
Visual Basic与图像处理14
Visual Basic 与图像处理(三) Visual Basic 做图像处理其实一直未专业人员所不屑,很大原因在于其速度不快,甚至很多初步接触图像处理的学生也是提到就皱眉,其实 Visual Basic 做图像处理理论研究并不是那么一无是处,尤其对于初学者,毕竟容易上手,能够快速的进行研究,还是有很多优点的,这里就不再辩论这个问题。 前文已经讲述了点运算的知识,也结合了一些实例来阐述 Visual Basic 进行图像处理的方法,从本节开始逐步进入稍微复杂的问题,但首先要解决的就是常说的处理速度的问题。本节还是从直方图均衡化那个实例下手,从实例分析来逐步提高运行速度。 引起 Visual Basic 图像处理速度慢的很大原因是前面说的非常多的两个函数 Point 和 PSet 方法,一个是从控件中取颜色点,一个是往控件界面上设置颜色点,无论取点还是设置点,都是要调用显存的,这显然会降低速度。在前面的直方图均衡化程序中,在灰度统计的时候遍历了一次图像,挨个取颜色点的值,而在后面设置颜色点,得到目标图像的时候,又得遍历一次图像,我们能想到的第一个办法就是尽量减少使用 Point 和 PSet 的次数。前面提到过,图像的本质就是一个矩阵,而矩阵在程序设计中往往是用数组进行表示的,如果在第一次取点以后就把得到的数据放置于数组中,那么后文再次调用这些数据时,就可以直接调用这个数组,可以有效的提高程序运行速度。 本例基于上述思路,采用数组来存储图像数据,由于在程序运行前,图像数据大小还不知道,因此需要采用动态数组来实现数据的存储,运行界面与前面的一样,如下图所示: 首先在窗口模块中定位了两个窗口级别的动态数组 SourceImData() 和 DestImData() ,在得到图像的高度和宽度以后就可以定义数组的大小,通过数组可以减少使用 Point 方法的次数,直方图均衡化按钮对应的代码调整如下: Private Sub cmdGrayEqua_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Hist(255) As Long ' 存放原直方图统计结果 Dim P(255) As Single ' 存放原直方图概率 Dim PA(255) As Single ' 存放原直方图累计分布概率 Dim Map(255) As Single ' 存放灰度等级映射结果 Dim NGrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ReDim SourceImData(SourceImHeight - 1, SourceImWidth - 1) As Integer ReDim DestImData(DestImHeight - 1, DestImWidth - 1) As Integer ' 图像的直方图统计 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b SourceImData(i, j) = GrayValue Hist(GrayValue) = Hist(GrayValue) + 1 Next j Next i P(0) = Hist(0) / SourceImHeight / SourceImWidth Map(0) = 255 * P(0) For i = 1 To 255 P(i) = P(i - 1) + Hist(i) / SourceImHeight / SourceImWidth Map(i) = 255 * P(i) Next i ' 图像的直方图均衡化 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 NGrayValue = Map(SourceImData(i, j)) PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub 如果细心对比,会发现通过这样一个改变,已经能稍微提高该程序的运行速度了,当然还是没有达到理想的要求,后面会继续讨论。
2541 次阅读|0 个评论
Visual Basic与图像处理13
热度 1 prrsw 2012-10-11 13:52
Visual Basic 与图像处理 ( 二 ) 到直方图均衡化结束,常见的点运算处理已经结束,适当总结两句,点运算是图像处理的入门,所谓入门也就是只有你跨过这个门槛才能算这个行业的人,但并不是你掌握了点运算就掌握了多少知识,而是希望学生通过学习这一章的知识知道图像处理的流程以及基本的实现方法。 本章所使用的方法以及涉及的理论并不复杂,也很容易掌握,但并不表示用处不大,比如本章涉及的阈值分割往往是检测类的图像分析所必须要涉及的一个步骤,只是在本章中阈值是自行设定的,而在具体实际问题时,需要采用一定的数学方法完成阈值的自动计算。我在上课时一直跟学生说,图像处理说到底也只是一个工具,分析具体问题时还是得到数学、信息等方面的知识,但是如果工具都掌握不好,也就无法解决实际的问题了。 即使是点处理可能也需要适当变通,前一段有个博士生在研究中发现直方图均衡化与 Photoshop 中的“自动对比度”菜单效果不一致,而在研究中发现利用“自动对比度”可以完成其论文研究中的其中一个步骤,就想找出这种操作的原理,我们找了好多本书都没有找到,而最后意外的在某个网页中发现了其中的原理介绍,顺利解决了这个问题。我想说的是,学无止境,并不是说你学会了一个东西就能解决所有问题,只有在不断研究之中,发现新的问题,解决新的问题,才能逐步提高自己的能力。 我在这里更新这个博客的目的,也是希望给初步进入这个研究领域的学生或者研究者提供一点点细微的帮助,希望大家一切都能够顺利。第一章终于结束了,我是一边编程,一边写这个文档,多多少少会出现一些问题,希望看到的同仁们不要笑话。
2318 次阅读|1 个评论
Visual Basic与图像处理12
prrsw 2012-10-11 13:40
Visual Basic与图像处理12
Visual Basic 与图像处理 ( 二 ) 9 、直方图均衡化 直方图均衡化也成为灰度均衡,是点运算较为复杂的一种,其基本原理是对图像中像素个数较多的灰度区域进行范围拓宽,而对像素较少的灰度区域,即在图像画面中不起主要作用的灰度值进行归并。一般在图像比较或者分割之前进行直方图均衡,可以使图像具有较为一致格式。比如由于光照条件使得同一背景图像有较大的亮度反差就可以利用直方图均衡化进行亮度调整。 设 f(i, j), g(i, j) 分别为原图像和处理后的图像,图像的灰度等级变换范围为 ,直方图均衡化可以按照以下的步骤进行: (1) 原图像直方图统计结果为 Hist ; (2) 求原图像直方图的灰度分布概率,记作 p ; (3) 计算元图像各个灰度等级的累计分布概率,记作 PA ,显然 PA =0, PA =1 ; (4) 进行直方图均衡化新的灰度值计算,将新的灰度值存放于映射 Map 中,其中: Map =255 × PA 。 从上述步骤来看,要做直方图均衡化,首先要计算直方图统计结果,然后再得到每个灰度等级对应的新的灰度等级,最后才能完成直方图均衡化操作。程序的实现与前面的类似,这里不在详细讲述,该例的运行界面如下图所示: 直方图均衡化按钮对应的代码如下: Private Sub cmdGrayEqua_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Hist(255) As Long ' 存放原直方图统计结果 Dim P(255) As Single ' 存放原直方图概率 Dim PA(255) As Single ' 存放原直方图累计分布概率 Dim Map(255) As Single ' 存放灰度等级映射结果 Dim NGrayValue As Integer ThresholdValue = Val(txtThreshold) ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ' 图像的直方图统计 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b Hist(GrayValue) = Hist(GrayValue) + 1 Next j Next i P(0) = Hist(0) / SourceImHeight / SourceImWidth Map(0) = 255 * P(0) For i = 1 To 255 P(i) = P(i - 1) + Hist(i) / SourceImHeight / SourceImWidth Map(i) = 255 * P(i) Next i ' 图像的直方图均衡化 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b NGrayValue = Map(GrayValue) PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub
2465 次阅读|0 个评论
Visual Basic与图像处理11
prrsw 2012-10-11 11:30
Visual Basic与图像处理11
Visual Basic 与图像处理 ( 二 ) 8 、灰度拉伸 灰度拉伸是将图像中不同灰度等级按照预定的方式进行拉伸,从实质上来说灰度拉伸是灰度线性变换的一种延伸,当然也不完全等同于灰度线性变换,而是对灰度等级进行分段,然后分别进行线性变换。灰度拉伸可以用下面的函数表达式表示: 式中 (x1, y1) 和 (x2, y2) 是灰度拉伸中两个转折点的坐标,如下图中的 A , B 两点。 相比于线性变换,灰度拉伸可以更灵活更改图像的灰度,可以根据需要选择性的变换某个灰度等级范围内的像素点。在本例中,采用图形化控制的方法设定上述两个转折点,这里涉及了一个平时称为“橡皮筋”的技术,在网络上有很多介绍橡皮筋技术的文章,在 Visual Basic 中利用 DrawMode 属性可以非常便捷的实现所谓的橡皮筋效果。在本例中专门放置了一个用于设定转折点的 PictureBox 控件,在 PictureBox 中鼠标左键按下时,选择第一个转折点,然后鼠标拖动到第二个转折点松开鼠标左键,当鼠标左键再次按下时,将 PictureBox 清空,重新设置转折点。整个系统的运行界面如下: 其中灰度拉伸按钮对应的代码如下: Private Sub cmdGrayStrech_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Map(255) As Integer ' 采用映射模式计算拉伸后的灰度 Dim k(2) As Single, t(2) As Integer ' 存放三条直线的斜率和截距 Dim NGrayValue As Integer ThresholdValue = Val(txtThreshold) ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ' 第一条直线斜率和截距 k(0) = (255 - StartPY - 0) / (StartPX - 0) t(0) = 0 For i = 0 To StartPX Map(i) = i * k(0) + t(0) Next i ' 第二条直线斜率和截距 k(1) = ((255 - EndPY) - (255 - StartPY)) / (EndPX - StartPX) t(1) = (255 - EndPY) - k(1) * EndPX For i = StartPX + 1 To EndPX Map(i) = i * k(1) + t(1) Next i ' 第二条直线斜率和截距 k(2) = (255 - (255 - EndPY)) / (255 - EndPX) t(2) = (255 - EndPY) - k(2) * EndPX For i = EndPX + 1 To 255 Map(i) = i * k(2) + t(2) Next i ' 图像的灰度拉伸变换 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b NGrayValue = Map(GrayValue) PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub 这里涉及的数组映射也是经常使用的一种技术,可以有效的提高软件的运行速度。 实现橡皮筋效应及转折点设置的代码分为三个部分,首先是鼠标左键按下,确定第一个转折点,然后是鼠标拖动时,实现的橡皮筋效果,最后鼠标左键抬起时,确定第二个转折点。第一个转折点和第二个转折点分别用窗口级变量来表示,分别是 StartPX, StartPY, EndPX, EndPY ,以便于后面计算直线的斜率和截距。 鼠标左键按下的代码如下: Private Sub PicDraw_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then ' 将 PictureBox 清空 PicDraw.Cls ' 画个边框 PicDraw.Line (0, 0)-(0, 255), RGB(255, 255, 255) PicDraw.Line (0, 0)-(255, 0), RGB(255, 255, 255) PicDraw.Line (0, 255)-(255, 255), RGB(255, 255, 255) PicDraw.Line (255, 0)-(255, 255), RGB(255, 255, 255) ' 鼠标左键已经按下 Flag = True StartPX = X StartPY = Y txtFirst = "(" Str(StartPX) ", " Str(255 - StartPY) ")" Label8.Left = StartPX Label8.Top = StartPY Label8.Caption = txtFirst PicDraw.Line (0, PicDraw.Height - 1)-(StartPX, StartPY), RGB(255, 255, 0) PicDraw.Line (StartPX, PicDraw.Height - 1)-(StartPX, StartPY), RGB(255, 0, 0) PicDraw.Line (0, StartPY)-(StartPX, StartPY), RGB(255, 0, 0) EndPX = X EndPY = Y End If End Sub 由于 DrawMode 模式是异或,因此设置颜色时需要根据互补色。 鼠标拖动的代码如下,注意观察如何实现橡皮筋效果: Private Sub PicDraw_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Flag = True Then ' 擦去前面的线条 PicDraw.Line (StartPX, StartPY)-(EndPX, EndPY), RGB(255, 255, 0) ' 由于取的是异或,为了画蓝色的线,将前面两个量满置 EndPX = X EndPY = Y ' 画上新的线条,实现橡皮筋效果 PicDraw.Line (StartPX, StartPY)-(EndPX, EndPY), RGB(255, 255, 0) End If End Sub 鼠标左键抬起的时候,确定第二个转折点,代码如下: Private Sub PicDraw_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) EndPX = X EndPY = Y txtSecond = "(" Str(EndPX) ", " Str(255 - EndPY) ")" Label9.Left = EndPX Label9.Top = EndPY Label9.Caption = txtSecond PicDraw.Line (EndPX, EndPY)-(PicDraw.Width - 1, 0), RGB(255, 255, 0) PicDraw.Line (PicDraw.Width - 1, EndPY)-(EndPX, EndPY), RGB(255, 0, 0) PicDraw.Line (EndPX, 0)-(EndPX, EndPY), RGB(255, 0, 0) Flag = False End Sub 需要注意的是 DrawMode 设置为 Xor Pen 表示在同一位置画同样的线时,将把原来的线擦除,从而可以实现橡皮筋效应,在窗体窗体时对 DrawMode 进行设置,代码如下: Private Sub Form_Load() PicDraw.DrawMode = 7 ' vbXorPen End Sub
3067 次阅读|0 个评论
Visual Basic与图像处理10
prrsw 2012-10-11 07:56
Visual Basic与图像处理10
Visual Basic 与图像处理(二) 7 、灰度窗口变换 灰度窗口变换是选择窗口中部分灰度等级的一种点运算方式,其实现方法与阈值变换类似。选择一定的灰度等级范围,在该范围内的灰度值保持不变,小于该范围下限的灰度值设置为 0 (黑色),而大于该范围上限的灰度值设置为 255 (白色)。灰度窗口变换可以用下面的函数形式进行表达: 这里的 L 表示窗口范围的下限, H 表示窗口范围的上限。 灰度窗口变换的在平时用途较为广泛,比如利用灰度窗口变换可以消除较暗或者较亮的背景,在软件设计时,该例与阈值变换非常相似,同样由两个 PictureBox 组成,另外在窗口中放置了两个文本框,分别用于存放窗口范围的下限和上限。本例的运行界面如下图所示 : 窗口变换按钮对应的代码如下: Private Sub cmdWindowTrans_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim NGrayValue As Integer Dim L As Integer, H As Integer ThresholdValue = Val(txtThreshold) ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth L = Val(txtL) H = Val(txtH) ' 图像的窗口变换 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b If GrayValue L Then NGrayValue = 0 ElseIf GrayValue H Then NGrayValue = 255 Else NGrayValue = GrayValue End If PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub
2868 次阅读|0 个评论
Visual Basic与图像处理9
热度 1 prrsw 2012-10-10 15:15
Visual Basic与图像处理9
Visual Basic 与图像处理 ( 二 ) 6 、阈值变换 图像的阈值变换可以将一幅图像变为黑白二值图像,即按照设定的阈值,如果图像中像素点的灰度值小于该阈值,则将该像素点的灰度值设定为 0 ,在图像中显示为黑色,否则将改点的灰度值设定为 255 ,在图像中显示为白色。有时候为强化阈值后的效果,也会将阈值结果进行反相。 阈值变换的原理可以表达为如下的函数形式: 这里的 T 就是设定的阈值。 阈值变换的实现方法也比较简单,在本例示范时,增加了一个水平滚动条用于设定阈值,其余界面与灰度线性变换的类似,软件的界面如下图所示: 这里用一个 ThresholdValued 窗体级别变量作为阈值,其中阈值变换按钮对于的代码如下: Private Sub cmdThresholdTrans_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim NGrayValue As Integer ThresholdValue = Val(txtThreshold) ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ' 彩色图像的阈值变换 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b If GrayValue ThresholdValue Then NGrayValue = 0 Else NGrayValue = 255 PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub 滚动条对应的代码如下: Private Sub HScroll1_Change() txtThreshold = Str(HScroll1.Value) End Sub 当文本框失去焦点时,也自动更改阈值,对应的代码如下: Private Sub txtThreshold_LostFocus() HScroll1.Value = Val(txtThreshold) End Sub
2544 次阅读|2 个评论
Visual Basic与图像处理8
prrsw 2012-10-10 11:24
Visual Basic与图像处理8
Visual Basic 与图像处理 ( 二 ) 5 、灰度线性变换 灰度线性变换也是一种典型的点运算,原理也比较简单,就是将图像中所有像素点的灰度按照线性函数进行变换,以 D image 表示目标图像, S image 表示源图像,灰度线性变换可以理解为: D image =k*S image +b 其中 k 为线性函数的斜率, b 为线性函数在 y 轴上的截距。当 k1 时,整个图像灰度的分布区域将变大,目标图像的整体对比度增大;反之,当 k1 时,整个图像灰度的分布区域将变小,目标图像的整体对比度减小;而 k=1 时,目标图像所有像素点的灰度增大或者减小,使得图像整体变亮或者变暗,而图像的整体对比度并不发生改变。 有两种特殊情况,当 k=1 , b=0 时,目标图像与原图像;而当 k=-1 , b=255 时,目标图像的灰度正好与原图像反转,就是平时所说的反相。 对于给定的 k 值和 b 值,对图像进行灰度线性变换比较简单,软件界面与灰度化处理的程序类似,直接更改其中的几句代码即可,软件的运行界面如下: 灰度线性变换按钮对应的代码如下: Private Sub cmdLinearTrans_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim NGrayValue As Integer Dim k As Integer, t As Integer ' 改用字母 t ,避免与颜色值变量重复 ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth k = Val(txtK) t = Val(txtB) ' 彩色图像的灰度线性变换 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b NGrayValue = k * GrayValue + t If NGrayValue 255 Then NGrayValue = 255 ' 如果超过 255 ,统一设定为 255 If NGrayValue 0 Then NGrayValue = 0 ' 如果小于 0 ,统一设定为 0 PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub 特殊情况下,当 k=-1 , b=255 时,实现的是图像的反相,效果如下图所示:
2930 次阅读|0 个评论
Visual Basic与图像处理7
prrsw 2012-10-10 10:44
Visual Basic与图像处理7
Visual Basic 与图像处理 ( 二 ) 4 、基于灰度直方图的灰度特征值计算 前文介绍过直接基于图像的每个像素点计算图像的均值和方差,在得到图像的灰度直方图统计以后,还可以根据直方图统计结果进行图像均值和方差的计算,这种算法效率更高,程序运行更快,尤其对于尺寸较大的图像,这种优势更为明显。算法的本质是将灰度等级相同的像素点进行归类,一次性计算出其和值,然后来计算均值和方差。本例将这种算法与前文直接根据像素点计算的方法进行比对,软件的界面如下: 从图中可以看出,两者的结果是一致的,其中基于直方图的特征计算按钮对应的代码如下: Private Sub cmdCalFeatureBaseHist_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Hist(0 To 255) As Long Dim SumValue As Long Dim MeanValue As Single Dim StdValue As Single ' 直方图统计 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b Hist(GrayValue) = Hist(GrayValue) + 1 Next j Next i ' 图像均值计算 For i = 1 To 255 ' 计算和值是,灰度等级为 0 的直接省略 SumValue = SumValue + Hist(i) * i Next i MeanValue = SumValue / SourceImHeight / SourceImWidth MeanValue = Format(MeanValue, "0.00") ' 保留两位小数 txtNewMean = Str(MeanValue) ' 图像标准差计算 SumValue = 0 For i = 0 To 255 SumValue = SumValue + (i - MeanValue) ^ 2 * Hist(i) Next i StdValue = Sqr(SumValue / SourceImHeight / SourceImWidth) StdValue = Format(StdValue, "0.00") ' 保留两位小数 txtNewStd = Str(StdValue) End Sub
2655 次阅读|0 个评论
Visual Basic与图像处理6
热度 2 prrsw 2012-10-10 10:24
Visual Basic与图像处理6
Visual Basic 与图像处理 ( 二 ) 3 、灰度直方图 灰度直方图是描述图像中像素灰度分布的一个统计图,简而言之就是描述图像中每个灰度值像素的个数或者概率,横坐标对应就是图像的灰度级别,纵坐标是该灰度级别对应的像素个数(或概率)。要得到图像的灰度直方图,首先要完成各灰度级别对应像素个数的统计,将统计结果存放于 Hist 数组中,然后再根据这个数组进行直方图的绘制。 基于前面的编程基础,相信要完成直方图统计应该都没有问题,这里要简要介绍一下直方图绘制的方法。前文提及过, PictureBox 不仅支持图像的读写,还支持图形的绘制,在这里为简便起见,只用一系列直线进行直方图的绘制, PictureBox 的 Line 方法可用于直线的绘制,其原型如下: object.Line (x1, y1) - (x2, y2), , 这里 (x1,y1) 为直线的起点, (x2,y2) 为直线的终点,如果没有 Step 表示直接从起点画到终点,如果有关键字 Step ,表示分别沿着 x1 , y1 在横向和纵向绘制 x2, y2 的长度, color 用于设置直线的颜色,可用 RGB 函数进行设定。如果使用了 B 选项,则 F 选项规定矩形以矩形边框的颜色填充。不能不用 B 而用 F 。如果不用 F 光用 B ,则矩形用当前的 FillColor 和 FillStyle 填充, FillStyle 的缺省值是 Transparent ,由于本例中只画直线,因此 B 选项和 F 选项都不选用。 在直方图绘制时,首先要确定每个灰度等级对应的线段长度,这里采用常见的一种方法,即首先找出统计概率最高的灰度等级,设定其绘制长度,其余灰度等级绘制的线段长度与该灰度等级成对比,假设概率最高的灰度等级对应的绘制长度为 L ,其他灰度等级的线段绘制长度可按照下面的方式进行计算: L gray = L * Hist / Hist max 首先对程序界面进行设计,本例主要由两个 PictureBox 组成,其中一个 PictureBox 用于存放图像,另一个用于直方图的绘制。用于直方图绘制的 PictureBox 宽度直接设置为 256 个像素,即每个灰度等级绘制的直线占的宽度都是 1 个像素。该程序的软件运行界面如下: 直方图绘制按钮对应的代码如下: Private Sub cmdHist_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Hist(0 To 255) As Long Dim maxHist As Long, L As Integer, L0 As Integer ' 直方图统计 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b Hist(GrayValue) = Hist(GrayValue) + 1 Next j Next i ' 直方图绘制 ' 第一步,寻找 Hist 数组中的最大值,即灰度等级统计概率最高者 maxHist = Hist(0) For i = 1 To 255 If maxHist Hist(i) Then maxHist = Hist(i) Next i ' 绘制直方图,其中最高概率的灰度等级绘制长度与 PictureBox 的高度一致 L = PicHist.Height For i = 0 To 255 L0 = L * Hist(i) / maxHist PicHist.Line (i, L - 1)-Step(0, -L0), RGB(0, 0, 255) ' 绘制蓝色线条 Next i End Sub
3855 次阅读|3 个评论
Visual Basic与图像处理5
prrsw 2012-10-10 09:28
Visual Basic与图像处理5
Visual Basic 与图像处理 ( 二 ) 2 、图像的特征值计算 这里所说图像的特征值是指可以直接从图像中提取出来的特征参数,常用于对图像的整体性评价,如图像的灰度均值可以用于判断图像整体亮度的高低。在图像灰度化的基础上可以很便捷的完成图像特征值的计算,本例中以两个基本的特征参数计算作为示范:均值和标准差。从本质上来说,图像灰度化以后就相当于一个二维矩阵,因此均值的计算只要求得图像中所有像素点的灰度值之和,再除以图像的高度与宽度的乘积即可,图像的标准差计算方法与此类似。以 MeanValue 和 StdValue 分别表示图像的均值和标准差,其计算公式如下: 首先设计程序的软件界面,本例中运行界面如下图: 同样“读入图像”按钮的代码与前文类似,这里给出特征值计算按钮对于的程序代码: Private Sub cmdCalFeature_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim SumValue As Long Dim MeanValue As Single Dim StdValue As Single ' 图像均值计算 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b SumValue = SumValue + GrayValue Next j Next i MeanValue = SumValue / SourceImHeight / SourceImWidth MeanValue = Format(MeanValue, "0.00") ' 保留两位小数 txtMeanValue = Str(MeanValue) ' 图像标准差计算 SumValue = 0 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b SumValue = SumValue + (GrayValue - MeanValue) ^ 2 Next j Next i StdValue = Sqr(SumValue / SourceImHeight / SourceImWidth) StdValue = Format(StdValue, "0.00") ' 保留两位小数 txtStdValue = Str(StdValue) End Sub
2614 次阅读|0 个评论
Visual Basic与图像处理4
prrsw 2012-10-10 08:39
Visual Basic与图像处理4
Visual Basic 与图像处理 ( 二 ) 有了上面介绍的 Point 和 PSet 方法以后就可以进入真正的图像处理阶段了,与平时学习一样,这里同样从最简单的图像处理技术——点运算开始讲起。点运算简而言之就是对图像进行逐点运算,得到所需要的特征参数或者新的图像。点运算之所以简单是因为点运算每次只需要考虑当前一个像素点的颜色值,当然点运算不可能改变图像内的空间关系。 点运算中最简单是获得图像的特征参数包括均值、方差等,另一种就是按照特定的方式对图像的直方图进行改变,这里的特定方式可以看成是从像素到像素的操作,常见的有对比度增强、对比度拉伸或灰度变换。后面将从图像灰度化、特征参数计算、直方图统计、灰度线性变换、灰度拉伸、直方图均衡化等几种常用的实例进行讲解,同时以 Visual Basic 软件进行算法实现。 1、 图像的灰度化 图像的灰度化是指将原始的彩色图像转换为灰度图像,这也是后续其他点运算操作的先前操作,也就是说点运算是基于灰度图像进行的。彩色图像中 Red 、 Green 、 Blue 三个分量值相等时,呈现出的就是一种灰度化的效果,因此要讲彩色图像转换为灰度图像只要将上述三个分量值设置为同样的值即可。这里需要讨论的只是设置灰度值的方法,有一种最简单的方法是取三个分量中的一个或者是平均值,但在实践中发现这种简单的转换方法与人的视觉习惯不太符合,因此有许多公司在研究这种灰度转换模型,在本节中,我们采用加权平均的方法实现图像的灰度化,方法如下: Gray = 0.3*Red+0.59*Green+0.11*Blue 下面通过一个实例实现彩色图像的灰度化,本例是后续点运算的基础,同样第一次涉及图像处理的完整流程,因此讲述的稍微详细一点。 为了强调原始图像与目标图像的概念,这也是在一般图像处理软件里面都会涉及的,本例中在窗体中放置两个 PictureBox 控件,分别用于存放原始图像与目标图像。 读取图像的方法与前文介绍的一致,即用 LoadPicture 函数进行图像读取,在获得原始图像的高度和宽度以后,按照预定方式进行目标图像的高度和宽度设置,然后利用循环语句遍历原始图像,逐个改变原始图像中每个像素点的值,并将其赋值到目标图像中,就可以完成图像的点运算。这里的循环语句是后面其他图像处理中也经常需要使用的一个标准过程,其基本格式如下 For i = 0 To h - 1 For j = 0 To w - 1 PixelValue = Picture1.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ’ 插入图像处理的过程,对 r, g, b 进行处理 …….………………………………. Picture2.PSet (j, i), RGB(RValue, GValue, BValue) Next j Next i 这里需要注意观察的是 Point 和 PSet 方法中坐标的位置,第一个坐标是横坐标,第二个坐标是纵坐标。 有了这个标准过程就可以理解图像灰度化处理的基本代码了,首先设计该程序的软件界面,效果如下图所示: 这里读入图像按钮的代码与前文类似,这里不在阐述,下面是灰度化按钮对于代码: Private Sub cmdGray_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ' 彩色图像的灰度化处理 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b PicDest.PSet (j, i), RGB(GrayValue, GrayValue, GrayValue) Next j Next i End Sub
3013 次阅读|0 个评论
Visual Basic与图像处理3
热度 1 prrsw 2012-10-9 19:19
Visual Basic与图像处理3
Visual Basic 与图像处理(二) 从本节开始,正式开始进入 Visual Basic 图像处理的内容,在正文中会结合一些实例来讲解 Visual Basic 处理图像的方法,当然在初始阶段,一切从简单的开始,在处理图像时也仅用 Point 与 PSet 相结合完成图像的读和写的两个过程。 1. 读入和保存图像 VB 中读入图像可以采用 LoadPicture 函数直接进行,当然也可以采用读取文件的方法直接读取图像数据,然后将图像数据在 PictureBox 中进行绘制。为了便于教学,一般都直接采用 LoadPicture 函数进行图像的读取, LoadPicture 函数的原型如下: LoadPicture ( , , , , ) as TPictureDisp 在我们读入图像时,一般直接使用下面的格式: Picture1.Picture=LoadPicture (FileName) 当 FileName 为空时,清空 PictureBox 中图像。 如果直接使用固定的 FileName 字符常量时,可读入存储器中固定位置的图像,如果希望以对话框的形式进行图像的选择性读取,可以使用 CommonDialog 控件实现。 图像保存对打开类似,可以使用写文件的形式进行图像数据的存储,在 Visual Basic 中提供了配合 PictureBox 控件专门的文件保存函数 SavePicture ,其函数原型如下: SavePicture ( Picture as TPictureDisp, FileName as String) 下面以一个实例示范如何进行图像读取和保存: 窗体中放有 1 个 PictureBox 控件用于显示图像, 2 个 CommandButton 分别用读取和保存图像, 1 个 CommodDialog 控件用于调用对话框。窗体外观如下: 注意设置 PictureBox 控件的相关属性。本例对应的相关代码如下: Option Explicit Private Sub cmdOpenImage_Click() Dim strFileName As String CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" ' 文件过滤,可以打开上述三类图像 CommonDialog1.ShowOpen If CommonDialog1.FileName "" Then strFileName = CommonDialog1.FileName PicShowImage.Picture = LoadPicture(strFileName) End If End Sub Private Sub cmdSaveImage_Click() Dim strFileName As String CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" ' 文件过滤,可以打开上述三类图像 CommonDialog1.ShowSave If CommonDialog1.FileName "" Then strFileName = CommonDialog1.FileName SavePicture PicShowImage.Picture, strFileName End If End Sub 2 、 PictureBox 控件中像素点颜色值存储格式 在 PictureBox 读入图像以后,像素点以长整型的格式存储在控件之中,利用 Point 方法可以实现像素点颜色值的读取,具体方法如下: Picture1.Point (x, y), 其中 x 为横坐标, y 为纵坐标。 在使用中常采用以下格式得到对应的值: Dim PixelValue as Long PixelValue=Picture1.Point (x, y) 为了便于后续运算,一般要完成颜色数据的分离,即将这个长整型的数转化为对应的 Red 、 Green 、 Blue 三个分量的值。在转化之前,首先看一下颜色值的存储方法,在 Visual Basic 中颜色点以下面的格式进行存储 : 其中第一个字节一般不使用,所以这里只讨论后面三个字节的分离,在数据合成时,上述三个分量分别占 1 个字节,如果将其理解为 256 进制就比如容易理解了,相当于十进制中的个位、十位和百位,只是在显示的时候还是以十进制的形式进行显示而已,如果要分离上述数据就比较简单了,只要将十进制转化为对应的 256 进制就可以了。十进制转化为二进制是除 2 取余法,转化为 256 进制也是采用同样的方法,除 256 取余即可。 下面就是作者在授课是经常采用的一种颜色数据分离方法 Dim r as Integer, g as Integer, b as Integer r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 3 . PictureBox 颜色点的写入 有了 Point 方法可以从 PictureBox 控件中读取颜色点值,对用还需要将某个颜色点值写入到对应的 PixtureBox 控件之中,这里采用与 Point 对用的 PSet 方法, PSet 的使用格式如下: Picture1.PSset (x, y), Color 这里的 Color 同样对应一个长整型的颜色数值,对上述数据分离对应的时,在数据处理时往往知道的是 Red, Green, Blue 三个分量的值,需要将这三个分量进行合成,得到长整型的颜色数值,合成方法与前面讲的非常类似,具体方法如下: PixelValue= r+256*g+256*b 当然在实际使用中还可以直接利用 RGB 函数进行颜色值的合成,使用方法如下: PixelValue=RGB(r, g, b) 下面结合一个实例结束这一部分内容,在完成图像读和写以后,本例中完成图像高度和宽度的自动读取,同时利用 Point 方法读取某个指定位置像素点的值,最后利用 PSet 方法将图像的左上角一块区域设置为红色。本例的运行结果如下: 对应的代码分别如下: Option Explicit Dim ImageHeight As Integer, ImageWidth As Integer Private Sub cmdOpenImage_Click() Dim strFileName As String CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" ' 文件过滤,可以打开上述三类图像 CommonDialog1.ShowOpen If CommonDialog1.FileName "" Then strFileName = CommonDialog1.FileName PicShowImage.Picture = LoadPicture(strFileName) End If ImageHeight = PicShowImage.Height ImageWidth = PicShowImage.Width Text1 = Str(ImageHeight) Text2 = Str(ImageWidth) End Sub Private Sub cmdPoint_Click() Dim r As Integer, g As Integer, b As Integer Dim x As Integer, y As Integer Dim pixelvalue As Long x = Val(Text3): y = Val(Text4) pixelvalue = PicShowImage.Point(x, y) r = pixelvalue Mod 256 g = (pixelvalue \ 256) Mod 256 b = pixelvalue \ 65536 Text5 = Str(r) Text6 = Str(g) Text7 = Str(b) End Sub Private Sub cmdPSet_Click() Dim i As Integer, j As Integer For i = 0 To 20 For j = 0 To 20 PicShowImage.PSet (i, j), RGB(255, 0, 0) Next j Next i End Sub
3455 次阅读|1 个评论
Visual Basic与图像处理2
prrsw 2012-10-9 15:47
Visual Basic与图像处理2
Visual Basic 与图像处理 ( 一 ) 4. PictureBox 控件 对于 Visual Basic 众多控件中,重点介绍一下这个 PictureBox 控件。 PictureBox 支持图像的读取,同时也支持图像的绘制,因此经常在 VB 中被用于图像处理使用。 PictureBox 支持常用的 bmp 、 jpg 和 gif 等格式的读取,自带简单的 Point 和 PSet 方法,便于构建简单的图像处理程序。 PictureBox 的 AutoSize 属性设定为 True 以后,读入图像中会自动调整 PictureBox 控件的大小,使其与图像的大小一致,从而可以自动获得图像的高度和宽度。为了使 PictureBox 的宽度和高度与图像的宽度与高度完全一致,可以将 PictureBox 的 BorderStyle 属性设置为 0-None 。 平时我们所说的图像的高度和宽度一般是以像素形式进行表示的,所以在控制绘制完成后,要将窗体以及 PictureBox 的 ScaleMode 属性设置为 3-Pixel ,这样得到的竖直才符合我们平时的认知。 下图即为一种的简单的程序实例,可以完成图像的读取和保存。 本例中 PictureBox 控件的相关属性已经进过设置,可以看出读取图像以后, PictureBox 控件的大小已经与图像一致,为了获得图像的高度和宽度可以使用下述语句: ImageHeight=Picture1.Height ImageWidth=Picture1.Width 5. 处理图像的三要素 这也是我经常跟学生讲的一句话,要理解图像处理的本质,首先要知道图像处理要从何下手,不管是什么语言,处理图像的语句可能不一样,但是基本过程是一致的。要处理图像首先要知道以下三个信息: (1) 第一个就是图像的高度和宽度,这也是平时遍历图像所需要的,在前面介绍 PictureBox 控件的时候已经做了简要介绍; (2) 图像的起点,也就是要理解图像的坐标格式,比如平时读取 bmp 图像是从左下角开始,在 VB 中, PicureBox 读入图像以后,图像的起点都是在左上角; (3) 每个像素的值,也就是要知道具体的图像内部数据,就好像矩阵处理要知道每个元素的值一样,前两个要素已经作了相关介绍,关于这个要素后文会专门介绍。 6. VB 图像处理的基本流程 这个流程也是初学者在编程时需要牢记的,这样才便于理清自己的思路。 l 读入图像并显示。 l 获得图像高度和宽度。 l 获得图像每一像素的数据。 l 对每一像素的数据进行相应变换。
3502 次阅读|0 个评论
Visual Basic与图像处理1
热度 1 prrsw 2012-10-9 14:58
Visual Basic 与图像处理(一) 1、 什么是图像? 图像的概念有很多种,当然有很多精确的名词解释,百度之即可得到,我这里解释的是便于向学生阐述的一种简单概念,如有学术同仁看到,请勿见笑。 所谓图像简而言之就是各种图形和影像的集合,平时所说的图像一般包含两种:矢量图和位图。矢量图有时也成为图形,所以有门课程叫图形图像学,即是各种图形的集合,有专门绘制和处理矢量图的软件比如 CorelDraw, Illustrator 等,当然用微软的 Office 软件业可以绘制各种矢量图,矢量图的存储时以坐标和方程形式进行存储,所以不会因为图像的缩放而出现模糊现象。 位图是一种点阵格式的图像,即图像数据是以一个个像素点形式进行排布的,如果把每个像素点看成独立的元素按,那么位图图像就可以理解为一种特殊的矩阵。我们这里研究的图像就是指这种位图图像。 图像处理就是指对图像进行分析、加工和处理,使其满足视觉、心理以及其他要求的一种技术,当然从本质上来说就是按指定的要求对矩阵进行处理的过程。从功能上来说,我们所说的图像处理可以分为两类,第一类是从图像到图像,即处理结果仍是一幅图像,只是增强或者削弱了图像的某些信息;第二类是图像到数据,即处理结果是以数据的形式出现,从图像中提取了所需要的特征信息。 2、 图像的种类 从图像的种类来说,平时一般把图像分为二值图像;灰度图像和彩色图像三种。二值图像即图像中像素只分为一种,一般是黑与白,在数值上以 0 与 1 ( 255 )表示,这种图像中每个像素只要一位即可表示,所占的存储空间非常小,但能够表达的信息也比较少。灰度图像所表达的信息比二值图像要丰富得多,普通的灰度图像每个像素点可以表达 0-255 个灰度等级,可以认为这种图像是真实信号的亮度表达,与以前的黑白电视机类似。对于彩色图像最常见的就是平时所说的 RGB 真彩色图像,即图像中每个像素点以三个字节表示,分别是 Red 、 Green 、 Blue 分量,每个分量取值范围都是 0-255 ,在有些系统中也将每个像素点三个分量进行合成,以一个长整型的变量进行表示,比如 VB 中像素点的表示方法即为如此。 3、 Visual Basic 简要介绍 在编程语言选择的时候,也考虑了实际应用情况以及学生的基础,当然也考虑到硕士生研究期限只有两年,选择了大部分纺织专业的硕士生在本科阶段初步学习过的 Visual Basic 6.0 软件,初期也考虑过使用 .net 版本,但各种原因吧,后来还是选择使用更为普及的 6.0 版本。 简要的总结了一下 Visual Basic 6.0 的特点: (1) 所见即为所得,便于程序员设计用户界面; (2) 面向对象进行编程,容易理解; (3) 支持 ActiveX 技术,容易使用第三方控件。当然 Visual Basic 程序员的数量以及网络资源也是考虑的其中一个要素,有了众多的研究人员和研究资料,学生在学习中碰到困难才容易解决。 对于 Visual Basic6.0 软件的使用介绍,这里就不详细介绍了,当然在上课时一般也会跟学生简要介绍一下各种功能的实现方法。
2982 次阅读|1 个评论
Visua Studio 2008 编译 cminpack
runningabc 2012-7-14 14:08
minpack有fortran版的和c/c++版的,后者称为cminpack 在cminpack的网站 http://devernay.free.fr/hacks/cminpack/index.html 中提到了cminpack相对于fortran的一些优点。其中一个优点就是cminpack中传入的函数指针的原型相比于fortran的minpack增加了一个void*型的指针,这个传入的指针有大作用,所有在函数体内部需要使用的相关参数都可以通过这个参数给传递进来。比如我们可以将所有参数组合定义为一个结构体,然后将指向该结构体的指针当做参数传递到该函数中。而在fortran当中,我们得定义一些全局变量来实现相同的功能,这对于大规模程序开发来说是不利的。 废话不多说了,从以上网站中找到相应的链接下载cminpack源程序 http://devernay.free.fr/hacks/cminpack/cminpack-1.3.0.tar.gz 解压后,找到cminpack.sln 我这里用的是Visual studio 2008,双击打开后会提示进行转换。 转换完成后,进行编译。 很遗憾,编译的时候报错了: 1------ 已启动生成: 项目: cminpack, 配置: Debug Win32 ------ 2------ 已启动生成: 项目: cminpack_dll, 配置: Debug Win32 ------ 2cminpack_dll : warning PRJ0009 : 未能打开生成日志进行写入。 2请确保该文件未被其他进程打开并且未被写保护。 1正在编译... 2正在编译... 1cl: 命令行 warning D9035 :“Wp64”选项已否决,并将在将来的版本中移除 1lmpar.c 2cl: 命令行 warning D9035 :“Wp64”选项已否决,并将在将来的版本中移除 2lmpar.c 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(219) : error C2143: 语法错误 : 缺少“;”(在“类型”的前面) 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(219) : error C2143: 语法错误 : 缺少“;”(在“类型”的前面) 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 2生成日志保存在“file://d:\My Projects\MyLib\cminpack-1.3.0\Debug\BuildLog.htm” 1生成日志保存在“file://d:\My Projects\MyLib\cminpack-1.3.0\Debug\BuildLog.htm” 1cminpack - 6 个错误,0 个警告 2cminpack_dll - 6 个错误,1 个警告 ========== 生成: 成功 0 个,失败 2 个,最新 0 个,跳过 0 个 ========== 容易发现,错误出在impar.c这个源文件当中。 找到219行,将 int i; 这行代码注释起来,然后跳到131行,加上一行代码 int i; 重新编译,这次编译通过了,不过有一个小小的warning cl: 命令行 warning D9035 :“Wp64”选项已否决,并将在将来的版本中移除 这个warning无关紧要,不过如果你想更清爽一点的话 找到:项目==cminpack属性==C/C++==常规==检测64位可移植性问题,设置为“否” OK,重新编译,这下整个世界就清净了。 1------ 已启动生成: 项目: cminpack, 配置: Debug Win32 ------ 1正在编译... 1chkder_.c 1covar.c 1covar1.c 1covar_.c 1dogleg.c 1dogleg_.c 1dpmpar.c 1dpmpar_.c 1enorm.c 1enorm_.c 1fdjac1.c 1fdjac1_.c 1fdjac2.c 1fdjac2_.c 1hybrd.c 1hybrd1.c 1hybrd1_.c 1hybrd_.c 1hybrj.c 1hybrj1.c 1正在生成代码... 1正在编译... 1hybrj1_.c 1hybrj_.c 1lmder.c 1lmder1.c 1lmder1_.c 1lmder_.c 1lmdif.c 1lmdif1.c 1lmdif1_.c 1lmdif_.c 1lmpar.c 1lmpar_.c 1lmstr.c 1lmstr1.c 1lmstr1_.c 1lmstr_.c 1qform.c 1qform_.c 1qrfac.c 1qrfac_.c 1正在生成代码... 1正在编译... 1qrsolv.c 1qrsolv_.c 1r1mpyq.c 1r1mpyq_.c 1r1updt.c 1r1updt_.c 1rwupdt.c 1rwupdt_.c 1chkder.c 1正在生成代码... 1正在创建库... 1生成日志保存在“file://d:\My Projects\MyLib\cminpack-1.3.0\Debug\BuildLog.htm” 1cminpack - 0 个错误,0 个警告 ========== 生成: 成功 1 个,失败 0 个,最新 1 个,跳过 0 个 ==========
7336 次阅读|0 个评论
VC++调用Matlab
thomaschoo2011 2012-7-10 17:21
先介绍下我的机器软件配置, WIN7 64bit, Matlab R2011b 64bit, VS2010. 在论坛上找了很久,看了N多帖子. 都无法让机器上VS2010调用R2011b的函数和引擎,总是出现错误信息: Link error: can't open "libmx.lib libmat.lib libeng.lib". 结果在Mathworks 的网页上发现了如下帖子,总算成功编译通过了. http://www.mathworks.com/support/solutions/en/data/1-FWTSV5/index.html?product=MLsolution=1-FWTSV5 文章的标题是: How do I setup a Visual Studio 2010 Express Project in order to run the engdemo.cpp example in MATLAB 7.13 (R2011b) on my 64bit machine? 后来发现,需要特别注意的是这里: “Configuration Properties” - “Linker” - “Input” and add libmx.lib, libmat.lib and libeng.lib as additional dependencies. 在输入libmx.lib, libmat.lib, libeng.lib 到 Additional Dependencies 框中时候, 必须用分号(;)分隔, 就是这样: libmx.lib; libmat.lib;libeng.lib; 否则就会出现can't open "libmx.lib libmat.lib libeng.lib".的错误信息. BTW,我的VS2010 是home premieum版, MATLAB 2011b
个人分类: 编程语言|4303 次阅读|1 个评论
关于visual c++10下正则表达式regex的环境设置问题
aamos 2012-5-30 09:45
平时的开发工具多为JAVA,突然间来了个需要C++编写的程序,周围也没有人熟悉VC的环境,只好自己动手,查了一圈,在VC下的正则表达式,基本上还是推崇采用boost工具,网上看到boost的在windows下的编译方法,折腾了不少时间,才算能用。 方法1: “1,下载Boost Release 1.44.0的文件包,下载的位置:然后解压缩到自己设定的位置,我这里设定就是 C:\Boost ,名称越简洁越好,以免发生意外。 2,设定 msvc 的版本跟编译器信息 可能很多人不愿意跟我一样使用这样的目录,为了方便起见,这里用 $BOOST$ 代表你的 Boost 的安装或者解压缩路径,比如在我的机器下,$BOOST$ 就等价于 C:\Boost 。 在 $BOOST$\tools\build\v2\user-config.jam 找到下面的几行: # Configure specific msvc version (searched for in standard locations and PATH).# using msvc : 8.0 ; #添加 Visual Studio 2010 的配置 using msvc : 10.0 : : /wd4819 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 ; 如果是 Visual Studio 2005 就是 8.0 ,Visual Studio 2008 就是 9.0 ,这个应该没有疑问的。偷懒就直接粘贴过去吧,这个记下来也没啥用。 3,生成 bjam$BOOST$ 目录下面,有个文件 bootstrap.bat 的批处理文件,双击或者在命令行提示符窗口中打开,稍等片刻,就会在该目录下生成 bjam.exe 以及它的 log 文件。 4,编译 Boost::Regex,注意,这里只编译 Boost::Regex 库。到 $BOOST$ 目录下,键入bjam --toolset=msvc --with-regex stage,或者直接复制粘贴吧,免得麻烦。编译生成的库文件会被在目录 $BOOST$\stage\lib 中。比如,在我的机器上就是:C:\BOOST\STAGE\LIB libboost_regex-vc100-mt-1_44.lib libboost_regex-vc100-mt-gd-1_44.lib libboost_regex-vc100-mt-gd.lib libboost_regex-vc100-mt.lib" “ 5. 在Visual Studio 2010下,点击工程名,右键,property,linker,general,Additional library directories处选择你编译的库的目录,即上面给出的“C:\BOOST\STAGE\LIB” 在property,C/c++,general,additional include directories,中选择你BOOST存放的根目录,如前的C:\Boost 8.此时,程序应该可以运行Regex支持了。 另外,如果程序运行时提示找不到boost***.lib库,可以尝试设置property,C/c++,code generation, runtime library,更改相应的设置,如MDd,选择动态时,生成的EXE在跨环境时还需要相应的DLL文件,不是很好;而我按照如上方法做之后,最后只生成的两个lib文件,并没有生成静态环境下的两个,虽然环境最终可以运行。 方法2: 先到官网下载http://sourceforge.net/projects/boost/files/boost/1.49.0/,现在我下载的版本是1.47.0 解压缩后,打开windows命令行,转到“boost_1_47_0\tools\build\v2”目录下。 运行:bootstrap.bat,生成b2.exe和bjam.exe两个Build文件。 将“bjam.exe”自制到解压缩的根目录下(boost_1_47_0) 命令行到根目录下:执行:bjam toolset=msvc-10.0 variant=debug,release threading=multi runtime-link=static install toolset=msvc-10.0:Viusal Studio 2010,如果是2008的话就是9.0,2005就是8.0 variant=debug,release 生成哪些库文件。可以单选release也行的。 threading=multi:多线程支持 runtime-link=static:静态库 还有一些选项,可以参考说明文件,里面都有详细的说明的 个人觉得呢,还是的方法2比较合适一些,另外,在BOOST官网上,推荐有BOOST的windows安装版,我试了一下,感觉到还是比较省事,可以选择自己所需要的内容,但是程序安装的过程中需要在线下载。 参考来源: http://www.cnblogs.com/PerfectString/archive/2010/08/30/Demo_Boost_Regex.html http://blog.csdn.net/niying/article/details/6697269
个人分类: 技术|3564 次阅读|0 个评论
神经美学研究些什么东东?
charlesqwu 2012-5-24 09:56
神经美学研究些什么东东?
什么是神经美学? What is neuroaesthetics? Apparently it is an emerging interdisciplinary field between neuroscience and aesthetics. Although I heard the term long before, I essentially know nothing of it. This weekend there will be a conference on neuroaesthetics at UC Berkeley ( http://www.minervaberkeley.org/conferences/importance-of-being-playful ). As I am trying to determine whether or not to attend the conference, I searched the Internet to try and learn a bit more about this so-called neuroaesthetics discipline. I found that the wiki page on neuroaesthetics is a good introduction but is in English only ( http://en.wikipedia.org/wiki/Neuroesthetics ). I also found an introduction paper in Chinese, which is available as a PDF file for downloading at: http://journal.psych.ac.cn/jinzhan/qikan/manage/wenzhang/120505.pdf . If anyone interested in learning a bit more about neuroaesthetics, download it! Mona Lisa by Leonardo da Vinci: What are your brain activities when you see a painting like this?
3439 次阅读|0 个评论
vic的不同编译器版本运算速度初测
lincystar 2012-3-11 06:40
vic的不同编译器版本运算速度初测 自: http://hi.baidu.com/longlivehejian/blog/item/a04c801df115e89b87d6b6da.html 2010-11-11 16:05 感谢 abur 的无私帮助,好人啊! 师弟小饭用mingw中的gfortran同样成功编译了vic官方网站中提供的汇流程序。所有的编译成果已经应用到了同门内部所有vic相关软件。 将vic4.0.4源代码在cygwin、mingw和visual studio(vs)环境中分别进行编译,并做运算速度测试。 【编译环境】 机器:intel i5-540 2.53GHZ,windows 7 32bit 运行库:cygwin1.dll(for cygwin), mscvrt.dll(for mingw),msvcr100.dll(for vc++ 2010) 【测试方法】 测试数据:淮河息县流域400网格 测试方法:IDL7.1中,spawn vic,输出systime差值 【测试结果】 可执行文件(vicNl.exe)大小:cygwin( 479KB ),mingw( 570KB ),vc++ 2010( 155KB ) 模型运行时间:cygwin( 536秒 ),mingw( 251秒 ),vc++( 144秒 ) 模型输出准确性: cygwin与mingw输出完全一致 ,vc++输出的小数位在部分时段有细微差别 【初步分析】 1. 运行库的差异直接决定了运算时间。cygwin编译的vic运行时需要启动cygwin运行环境,并在cygwin环境中再调用c运行库的支持。而mingw和vc++,直接使用的是windows下的c运行库mscvrt.dll和msvcr100.dll,运行速度改进显著。特别地,vc++ 生成的release版本,不但可执行文件大小大大减小,运行效率也大幅度提高; 2. 运行cygwin编译的vic,至少需要cygwin1.dll的支持。而mingw依赖于mscvrt.dll,该文件可能从windows 98起就作为windows系统自带的文件。因此,mingw编译的vic几乎可以在任何安装windows系统的电脑上运行。vc++编译的vic需要msvcr100.dll支持; 3. mingw中,无需改动任何代码,就可以成功编译vic,运行结果与cygwin下完全一致。但vc++中需要手动添加一些文件,并对源代码稍作修改。特别是rint函数,目前对它的理解还不够清晰,只做了简单的四舍五入的处理,以确保编译成功。这可能是vc++编译的vic的输出与前两者有细微差别的原因。 【使用建议】 1. 模型实际应用中采用运算速度相对较快且稳定的mingw版本; 2. vic模型的学习借助vc++来进行,充分利用vs的强大的集成开发环境; 3. 对vc++ release版本vic进行深入调试,找出细微差别的原因。毕竟该版本可以将运行时间缩短为cygwin的1/4,是相当有诱惑力的。
个人分类: 研究进展|0 个评论
intel visual fortran 备忘
Daniel1985 2011-11-19 22:11
1 在vs2008如何设置可以显示行号? 菜单-工具-选项在新窗口中左面树菜单中展开“文本编辑器”,找到子项“所有语言”在右面的面板中 显示的行号前面打勾 2 运行之后,dos窗口一闪而过的解决 stop的上一行加pause, 这样就能按回车以后再结束程序了 (注意不能在stop之后)。 比如程序: program main implicit none write(*,*) Hello! pausestop end 其实这是因为直接用F5 start debugging的原因 如果用ctrl+F5 start without debugging就不会出现上述的问题。 3 声明语句中的双冒号 加两个冒号是新的语法。 Integer :: iA , iB 这样子与 Integer iA , iB 没有任何区别 但是当变量声明包含修饰词,比如 Allocatable , Private , Public , Parameter , Intent , Optional 等的时候,两个冒号就非常有必要了,它表示修饰词结束了。 比如: Integer,Allocatable,Public :: iA( : ) , iB( : ) 就不能省略两个冒号。 推荐你定义变量时都采用 两个冒号的 新写法。 有了两个冒号你在声明是可以直接符值
个人分类: ABAQUS/PYTHON/FORTRAN|5496 次阅读|0 个评论
[转载]qt 4.5 与 visual studio 集成
romanhead 2010-11-24 19:12
qt 4.5 与 visual studio 集成 转自: http://blog.csdn.net/soulmachine/archive/2009/04/06/4049631.aspx 本文主要讲述将 Qt 4.5 与 Visual Studio 2008 集成,同样适用于 Visual Studio 2005, 2003 。 Qt 4.5 虽然新增了 LGPL 协议,但这也阻碍了我们在 VS 中使用 Qt 。因为免费开源的版本只提供了 GCC 编译好的二进制库,而没有 VC 编译好的二进制库,只有商业版本才有 VS 编译好的针对 Windows 的 DLL , lib 等二进制库(恩,可以理解)。 再者, VC 编译器比 GCC 还是要强劲很多,并且调试器异常强大。 Qt Creator 虽然很酷,目前还很粗糙。很多人也更为熟悉 VS 的界面。 下面我们就自己用 VS 编译出二进制库,然后就可以跟商业版一样了。 不过,你也可以直接 googleqt 4.5 编译好,找到很多人已经编译好的二进制库,下载下来直接用。下面的内容可以不看了 ^_^ 1. 下载并安装 qt-sdk-win-opensource-2009.01.exe ,安装到默认的 c:\qt\2009.01 。它包含了 MingGW 和 Qt Creator ,以及预编译好的二进制文件(用 GCC 编译的)。你可以直接使用 Qt Creator 开始开发工作,不需要任何额外的配置。 2. 将整个目录 c:\qt\2009.01 拷贝一份到 c:\qt\4.5.0-vc 。我们将会修改目录 c:\qt\4.5.0-vc ,使用 VC++ 来编译出所需要的库。这两个目录可以同时存在, Qt 使用 c:\qt\2009.01 , Visual Studio 使用 c:\qt\4.5.0-vc 。 3. 修改 C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\ 下的 vsvars32.bat ,在环境变量 PATH 中添加 Qt 的目录,如 c:\qt\4.5.0-vc\qt ,在 INCLUDE 添加上 c:\qt\4.5.0-vc\qt\include ,在 LIB 添加 c:\qt\4.5.0-vc\qt\include ,如: @set PATH=C:\Qt\4.5.0-vc\qt;c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;c:\Program Files\Microsoft Visual Studio 9.0\VC\BIN;c:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools;c:\Windows\Microsoft.NET\Framework\v3.5;c:\Windows\Microsoft.NET\Framework\v2.0.50727;c:\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages;%PATH% @set INCLUDE=C:\Qt\4.5.0-vc\qt\include;c:\Program Files\Microsoft Visual Studio 9.0\VC\ATLMFC\INCLUDE;c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE;%INCLUDE% @set LIB=C:\Qt\4.5.0-vc\qt\lib;c:\Program Files\Microsoft Visual Studio 9.0\VC\ATLMFC\LIB;c:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;%LIB% 打开一个 cmd 命令行窗口,把这个文件拖过来执行,这样,你打开的 cmd 就具有上面设置的环境变量了,但是这些变量只针对你当前的 cmd ,不会更改本机配置,所以,不要关闭 cmd 窗口,你需要在这个 CMD 窗口中完成接下来的命令。 (网上很多没有这一步,会导致下面的 configure 失败) 4. 执行 c:\ cd c:\qt\4.5.0-vc\qt c:\qt\4.5.0-vc\qt configure -no-sql-sqlite -no-qt3support -no-opengl -platform win32-msvc2008 -no-libtiff -no-dbus -no-phonon -no-phonon-backend -no-webkit (这一步如果像这样编译的话,会导致tiff等图片不能被识别。应改成:) configure -debug-and-release -static -platform win32-msvc2008 -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -plugin-sql-sqlite -plugin-sql-odbc -no-qt3support -no-mmx -no-3dnow -no-sse -no-sse2 -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-webkit -no-scripttools -no-dsp -no-vcproj 上面这行命令,你可以按自己的需要修改,但注意一定要指明 -platform 后的参数,指明想要配置成那个版本的 VS 。例如系想要编译成 VS2005 (当然前提是你已经安装了 VS2005 ),就换成 win32-msvc2005 。这一步会生成一个 makefile 供 nmake 编译生成所有的库。这一步要花点时间,大概 30 分钟。 5. 输入 nmake ,回车,开始编译。这一步跟漫长,我的大概编译了 3 个小时 ~~ 注意: 如果你是 Windows 7 下,这里多半会失败,因为 Win 7 SDK 有 Bug ,在 binary 没有 resouce 区域的时候 mt 程序是不能把 manifest 添加到 binary 中的(参考: http://download.microsoft.com/download/8/8/0/8808A472-6450-4723-9C87-977069714B27/ReleaseNotes.Htm ),所以我们需要做一些修改才行, 第一步,在 CMD 下执行如下命令 c:\qt\4.5.0-vc\qtecho.hello.rc c:\qt\4.5.0-vc\qt rc.exe /r hello.rc 得到 c:\qt\4.5.0-vc\qt\hello.res 资源文件。 第二步,修改 qmake 配置文件,使得 Makefile 的链接命令中会把 hello.res 一并链接到 binary 中。修改 mkspecs\win32-msvc2005 目录下的 qmake.conf 文件第 52 行为 QMAKE_LFLAGS = /NOLOGO C:\Qt\4.5.0-vc\qt\hello.res 这样任何 link 命令都必然会链接 hello.res 文件。 然后才能输入 nmake 开始编译。 6. 安装官方的 VS 插件 qt-vs-addin-1.0.0-beta.exe , 7. 启动 Visual Studio ,选择菜单 Qt-Qt Options ,在 Qt Verions 选项卡点击 Add , Version Name 随便填,例如 qt4.5.0-vc ,路径则输入 C:\Qt\4.5.0-vc\qt 。(网上的资料有说要建立环境变量 QTDIR= C:\Qt\4.5.0-vc\qt ,我个人认为是不必要的)。 同时在 我的电脑-属性- Advanced system setting-enviroment variables中给path添加C:\Qt\4.5.0-vc\bin; 8. 现在你的 Visual Studio 完全具备了 Qt 的所有功能,新建一个 Qt 工程编译运行试一试! (编译好后,在 VS 下点击 Debug-Debug without debuggine 可以看见程序运行的效果,不过 如果直接到 debug 目录下双击这个 exe 文件,会提示找不到 QtCore4d.dll ,这时你需要把 C:\Qt\4.5.0-vc\qt\bin 加入到 PATH 环境变量,这目录下还有 QtCore4.dll ,都是上面编译出来的)。 不过你现在的环境是集成了 LGPL 版 Qt 的 VS ,跟商业版的还是有点不同。例如 Qt Desiner (资源设计器)不是嵌入到 VS 得,需要通过菜单 Qt-Launch Desiner 来执行(商业版直接双击 .ui 文件就会启动 Qt Desiner )。不过这无关紧要,只是多点几下鼠标而已。 点击 Qt-Launch Linguist 可以启动 Qt Linguist ,它是一款本地化工具,也十分有用。
个人分类: 生活点滴|3468 次阅读|0 个评论
11个窗口揭示仪器开发多平台编程奥秘
chrujun 2010-7-14 13:26
为了开发仪器,不得不同时打开11个窗口。先介绍这些窗口的作用,再写几句总结。 第一个窗口:显示DSP程序文件目录供选择。 第二个窗口:UltraEdit编辑器,用于编辑DSP和LINUX下的C程序。 第三个窗口:VISUAL C++开发环境,用于开发和调试上位机程序。 第四个窗口:与仪器的联机的TELNET终端,用于监控仪器工作状态。 第五个窗口:同样是与与仪器的联机的TELNET终端,用于启动和运行仪器中的各种程序。 第六个窗口:命令行窗口。用于编译DSP程序,用FTP将DSP程序传到仪器。 第七个窗口:命令行窗口。用于上传LINUX程序。 第八个窗口:虚拟机,用于交叉编译仪器中的LINUX程序。 第九个窗口:基于串口的超级终端,用于监控仪器的基本工作状态。 第十个窗口:显示LINUX源程序目录。 第十一个窗口:正在运行的上位机程序,用于控制仪器的测量过程,分析测量数据。 为了开发基于嵌入式控制系统和DSP的仪器,需要同时开发运行在DSP、ARM和PC机上的程序。PC机处于主控程序状态,全部程序都在PC机上开发,再通过网络或串口传到下位机。为了实现不同程序的同步工作和调试,需要运行全部程序开发工具,再加上网络传输工具,这个要求必须要同时打开11个窗口,才能满足仪器开发的基本要求。
个人分类: 地球物理及仪器|4906 次阅读|12 个评论
[转载]Visual Studio 2008安装失败 "Web 创作组件"无法安装
zdpbeauty 2010-4-15 16:39
Visual Studio 2008 中文正式版可以从微软网站下载试用了,因为之前用英文版感觉比2005快一些,虽然.NET Framework 3.5有点庞大,但还是可以选择开发2.0的项目,因此打算立马安装。试用期为三个月,足够长了,因此安装Team System版本,体验一下新特性。但是最担心的事情还是发生了无法安装。 问题出在哪里呢?我打算找出原因,试图解决问题。 因为除Visual Studio本身以外,VS安装过程中安装的其他附带安装的组件,基本上都是有单独安装包的。先找到Visual Studio Web 创作组件的独立安装包,试试单独安装能不能成功。 果然,在安装DVD的\WCU\WebDesignerCore文件夹中找到了Visual Studio Web 创作组件的安装程序。将其复制到硬盘上并解压缩,可以发现该组件使用的是Office 2007的安装方式,运行其中的setup.exe,出现与Office 2007相同的安装程序界面。单击立即安装,结果出现找不到office.zh-cn文件夹中文件的对话框,选择了安装程序所在的正确位置并确定,又再一次弹出同样的窗口,安装无法继续: 仔细核对文件名,确定安装文件夹中的确有需要的文件,但为什么还是提示找不到呢? 既然这个组件使用Office 2007的安装方式,文件夹中也有office.zh-cn这个和Office 2007共有的组件,那会不会是因为Office 2007的问题,导致Visual Studio Web 创作组件无法安装呢? 打开Vista中的程序和功能,选择Office 2007,并单击更改按钮,在弹出的安装程序界面中,选择修复,并继续, 果然不出所料,这时也出现了同样的找不到安装文件的对话框,基本确定是因为Office 2007的问题导致Visual Studio 安装失败。 这时想起来,在安装Office时,安装程序默认情况下会将安装文件缓存在系统分区的隐藏文件夹MSOCache中,安装完成后并不会将其删除。由于这个文件夹实在是太大了,平常用Office其实并不需要它,因此安装完Office之后就手动将其删除了,而在修复Office组件时,需要访问MSOCache文件夹中的安装文件,所以就出现了以上问题。以往的经验是,已删除MSOCache文件夹时,可以放入Office原来的安装光盘,即可顺利修复。 于是直接放入Office 2007的安装光盘,在弹出寻找文件的对话框时,指向安装盘中office.zh-cn文件夹所在的位置(一般是光驱根目录),Office 2007被成功修复,这时再安装Visual Studio Web 创作组件,也顺利的安装上了: 接下来启动Visua Studio 2008安装程序,也顺利的安装,没有再遇到问题。安装完成后可以再次删除安装Visual Studio Web 创作组件时缓存下来的MSOCache文件夹(注意是隐藏文件夹)。 至此终于找到原因,原来是因为Office 2007的安装源缓存MSOCache文件夹被用户删除导致的。只要找到Office 2007的安装文件,即可顺利安装Visual Studio Web 创作组件。 最后还要考虑一个问题,为什么指向Visual Studio Web 创作组件安装程序中的office.zh-cn文件夹无法通过验证,而Office 2007安装盘中的office.zh-cn文件就可以呢?对比两个文件夹发现,其中只有OfficeLR.cab、officemui.msi、officemui.xml三个文件不同,而前两个主要文件,仅仅是数字签名日期不同。可能是由于系统中已经安装了Office 2007,而记录了这些安装程序的哈希值,安装程序只承认Office 2007的安装文件版本,而不接受其他的版本。 详细出处参考: http://www.jb51.net/article/15126.htm VS2008中文试用版刚出来不久就上网拖了下来 可是 安装 的时候却出问题了。后来,Google了下,把自己遇到的问题和解决方法跟大家分享。 1.让试用版变成正式版 从Microsoft那下了7个压缩文件分包后,解压后是一个ISO文件。 我用UltraISO编辑了下ISO文件:Setup--setup.sdb文件提取出来编辑,将 T2CRQGDKBVW7KJR8C6CKXMW3D 改成 PYHYPWXB3BB2CCMV9DX9VDY8T 这样,安装的时候就默认是这个正版的序列号了。 还有一种方法就是,不改这个文件,安装后,再添加删除程序的时候可以输入序列号: PYHYP-WXB3B-B2CCM-V9DX9-VDY8T 也可以变成正版。 好了,可以安装了^_^ 顺便把下载连接贴出来: 官方下载地址: http://www.microsoft.com/downloa ... p;displaylang=zh-cn 或直接下载压缩: http://download.microsoft.com/do ... SX1429243.part1.exe http://download.microsoft.com/do ... SX1429243.part2.rar http://download.microsoft.com/do ... SX1429243.part3.rar http://download.microsoft.com/do ... SX1429243.part4.rar http://download.microsoft.com/do ... SX1429243.part5.rar http://download.microsoft.com/do ... SX1429243.part6.rar http://download.microsoft.com/do ... SX1429243.part7.rar 团队资源管理器: http://download.microsoft.com/do ... TeamExplorerCHS.iso 一些VS2008介绍及学习资料: Visual Studio 2008的性能改进以及十大新功能: http://news.csdn.net/n/20080125/113132.html CSDN--Visual Studio 2008专题 http://subject.csdn.net/vs2008/
个人分类: 网络编程|3699 次阅读|0 个评论
Visual C++开发工具与调试技巧整理
whq2008 2009-9-8 17:32
引自 http://dev.yesky.com/133/7578633.shtml 自己总是用VC平台来开发东西,但是有时候总是出这样那样的问题,在这里把 VisualC++开发工具与调试技巧 整理摘录如下,希望对大家有用,省去大家再去搜索的烦恼。    1.如何在Release状态下进行调试   Project-Setting=ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debutinfo选ProgramDatabase。在Link标签中选中Generatedebuginfo复选框。   注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。    2.Release和Debug有什么不同   Release版称为发行版,Debug版称为调试版。   Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。   Release的exe文件链接的是标准的MFCDLL(UseMFCinasharedorstaticdll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装VisualC++6.0的机器上运行。而Debug版本的exe链接了调试版本的MFCDLL文件,在没有安装VisualC++6.0的机器上不能运行,因为缺相应的DLL,除非选择usestaticdllwhenlink。    3.ASSERT和VERIFY有什么区别   ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然翻译,但不再判断真假。所以后者更安全一点。   例如ASSERT(file.Open(strFileName))。   一旦到了Release版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。如果用VERIFY()就不会有这个问题。    4.Workspace和Project之间是什么样的关系   每个Workspace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的Setting..中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。    5.如何在非MFC程序中使用ClassWizard   在工程目录下新建一个空的.RC文件,然后加入到工程中就可以了。    6.如何设置断点   按F9在当前光标处增加一个断点和取消一个断点。   另外,在编辑状态下,按Ctrl+B组合键,弹出断点设置对话框。然后单击【Condition】按钮弹出设置断点条件的对话框进行设置。    7.在编辑状态下发现成员变量或函数不能显示提示是如何打开显示功能   这似乎是目前这个VisualC++6.0版本的一个bug,可按如下步骤使其正常,如再出现,可如法炮制:   (1)关闭Project   (2)删除工程名.ncb文件   (3)重新打开工程    8.如何将一个通过ClassWizard生成的类彻底删除   首先在工作区的FileView中选中该类的.h和.cpp文件,按delete删除,然后在文件管理器中将这两个文件删除,再运行ClassWizard,这时出现是否移走该类的提示,选择remove就可以了。    9.如何将在workspace中消失的类找出来   打开该类对应的头文件,然后将其类名随便改一下,这个时候工作区就会出现新的类,再将这个类改回原来的名字就可以了。    10.如何清除所有的断点   菜单【Edit】-【Breakpoints】,打开Breakpoints对话框,单击【RemoveAll】按钮即可。快捷键是Ctrl+Shift+F8。    11.如何再ClassWizard中选择未列出的信息   打开ClassWizard对话框,然后切换到ClassInfo页面。改变Messagefilter,如选择Window,Message页面就会出现Window的信息。    12.如何检测程序中的括号是否匹配   把光标移动到需要检测的括号前面,按快捷键Ctrl+]。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告。    13.如何查看一个宏(或变量、函数)的定义   把光标移动到要查看的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的相关菜单),如果没有建立浏览文件,就会出现提示对话框,按【确定】按钮,然后就会跳到该宏(或变量、函数)定义的地方。    14.如何添加Lib文件到当前工程   单击菜单【Project】-【Settings】弹出ProjectSetting对话框,切换到Link标签页,在Object/librarymodules处输入Lib文件名称,不同的Lib之间用空格格开。    15.如何快速删除项目下的Debug文件夹中临时文件   在工作区的FileView视图中选中对应的项目,单击右键弹出菜单,选择【Clean(selectiononly)】菜单即可。    16.如何快速生成一个现有工程除了工程名外完全相同的新工程   在新建工程的New对话框中选择CustomAppwizard项,输入新工程的名字,单击【OK】按钮。出现CustomAppWizard项,输入新工程的名字,单击【OK】按钮。出现CustomAppWizard-Step1of2对话框,选择AnexistingProject项,单击【Next】按钮。出现CustomAppWizard-Step2of2对话框,选择现有工程的工程文件名,最后单击【Finish】按钮。编译后就生成一个与现有工程相同但可以重新取名的工程AppWizard。   现在就可以项用MFCAppWizard一样用这个定制的向导。如果不想用了,可以在VisualC++6.0安装目录下Common\MSDev98\Template目录中删除该Wizard对应的.awx和.pdb文件。    17.如何解决VisualC++6.0不正确连接的问题   情景:明明改动了一个文件,却要把整个项目全部重新编译链接一次。刚刚链接好,一运行,又提示重新编译链接一次。   这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。可以这样处理:找到工程文件夹下的debug目录,将创建和修改时间都比系统时间的文件全部删除,然后再从新RebuildAll一次。    18.引起LNK2001的常见错误都有哪些   遇到的LNK2001错误主要为:unresolvedexternalsymbolsymbol   如果链接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误信息
个人分类: 未分类|5636 次阅读|1 个评论
[转贴]VC常用数据类型使用转换详解
fswdong 2009-6-21 08:36
个人在算法调试过程中主要使用VC6,所以经常遇到一些基本类型转换问题,所以收集了这份小小的资料,以备后用 vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以\0结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。 而LPCSTR中增加的C的含义是CONSTANT(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。 1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的. 2.C表示const 3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char. 为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。 LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。 然后为了实现两种编码的通用,提出了TCHAR的定义: 如果定义_UNICODE,声明如下: typedef wchar_t TCHAR; 如果没有定义_UNICODE,则声明如下: typedef char TCHAR; LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。 CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。 LPCTSTR: #ifdef _UNICODE typedef const wchar_t * LPCTSTR; #else typedef const char * LPCTSTR; #endif VC常用数据类型使用转换详解 先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username ; char *buf; CString str; _variant_t v1; _bstr_t v2; 一、其它数据类型转换为字符串 短整型(int) itoa(i,temp,10); //将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); //按二进制方式转换 长整型(long) ltoa(l,temp,10); 二、从其它包含字符串的变量中获取指向该字符串的指针 CString变量 str = 2008北京奥运; buf = (LPSTR)(LPCTSTR)str; BSTR类型的_variant_t变量 v1 = (_bstr_t)程序员; buf = _com_util::ConvertBSTRToString((_bstr_t)v1); 三、字符串转换为其它数据类型 strcpy(temp,123); 短整型(int) i = atoi(temp); 长整型(long) l = atol(temp); 浮点(double) d = atof(temp); 四、其它数据类型转换到CString 使用CString的成员函数Format来转换,例如: 整数(int) str.Format(%d,i); 浮点数(float) str.Format(%f,i); 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 str = username; 五、BSTR、_bstr_t与CComBSTR CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR(数据); //使用前需要加上头文件comutil.h 反之可以使用char *p=_com_util::ConvertBSTRToString(b); 六、VARIANT 、_variant_t 与 COleVariant VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4; //指明整型数据 va.lVal=a; //赋值 对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dblVal; VT_R8 VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE date; VT_DATE BSTR bstrVal; VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|VT_I2 long FAR* plVal; VT_BYREF|VT_I4 float FAR* pfltVal; VT_BYREF|VT_R4 double FAR* pdblVal; VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL SCODE FAR* pscode; VT_BYREF|VT_ERROR CY FAR* pcyVal; VT_BYREF|VT_CY DATE FAR* pdate; VT_BYREF|VT_DATE BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH SAFEARRAY FAR* FAR* pparray; VT_ARRAY|* VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT void FAR* byref; VT_BYREF _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。 例如: long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i; COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: COleVariant v3 = 字符串, v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal; 七、其它 对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如: LPARAM lParam; WORD loValue = LOWORD(lParam); //取低16位 WORD hiValue = HIWORD(lParam); //取高16位 对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: WORD wValue; BYTE loValue = LOBYTE(wValue); //取低8位 BYTE hiValue = HIBYTE(wValue); //取高8位 如何将CString类型的变量赋给char*类型的变量 1、GetBuffer函数: 使用CString::GetBuffer函数。 char *p; CString str=hello; p=str.GetBuffer(str.GetLength()); str.ReleaseBuffer(); 将CString转换成char * 时 CString str(aaaaaaa); strcpy(str.GetBuffer(10),aa); str.ReleaseBuffer(); 当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer(); 还有很重要的一点就是,在能使用const char *的地方,就不要使用char * 2、memcpy: CString mCS=_T(cxl); char mch ; memcpy(mch,mCS,20); 3、用LPCTSTR强制转换: 尽量不使用 char *ch; CString str; ch=(LPSTR)(LPCTSTR)str; CString str = good; char *tmp; sprintf(tmp,%s,(LPTSTR)(LPCTSTR)str); 4、 CString Msg; Msg=Msg+abc; LPTSTR lpsz; lpsz = new TCHAR ; _tcscpy(lpsz, Msg); char * psz; strcpy(psz,lpsz); CString类向const char *转换 char a ; CString str(aaaaaa); strncpy(a,(LPCTSTR)str,sizeof(a)); 或者如下: strncpy(a,str,sizeof(a)); 以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *. CString转LPCTSTR (const char *) CString cStr; const char *lpctStr=(LPCTSTR)cStr; LPCTSTR转CString LPCTSTR lpctStr; CString cStr=lpctStr; 将char*类型的变量赋给CString型的变量 可以直接赋值,如: CString myString = This is a test; 也可以利用构造函数,如: CString s1(Tom); 将CString类型的变量赋给char ; sprintf(tmp, %s,(LPCSTR)str); (LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)str CString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str 然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成LPTSTR去掉const,是极为危险的! 一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。 2、strcpy()函数 CString str; char c ; strcpy(c, str); char mychar ; CString source=Hello; strcpy((char*)mychar,(LPCTSTR)source); 关于CString的使用 1、指定 CString 形参 对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符 (LPCTSTR) 而非 CString 的 const 指针。 当将形参指定为指向字符的 const 指针时,可将指针传递到 TCHAR 数组(如字符串 )或传递到 CString 对象。 CString 对象将自动转换成 LPCTSTR。任何能够使用 LPCTSTR 的地方也能够使用 CString 对象。 2、如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即 const CString)。如果函数要修改该字符串, 则删除 const 修饰符。如果需要默认为空值,则将其初始化为空字符串 ,如下所示: void AddCustomer( const CString name, const CString address, const CString comment = ); 3、对于大多数函数结果,按值返回 CString 对象即可。 串的基本运算 对于串的基本运算,很多高级语言均提供了相应的运算符或标准的库函数来实现。 为叙述方便,先定义几个相关的变量: char s1 =dir/bin/appl,s2 =file.asm,s3 ,*p; int result; 下面以C语言中串运算介绍串的基本运算 1、求串长 int strlen(char *s); //求串s的长度 【例】printf(%d,strlen(s1)); //输出s1的串长12 2、串复制 char *strcpy(char *to,*from);//将from串复制到to串中,并返回to开始处指针 【例】strcpy(s3,s1); //s3=dir/bin/appl,s1串不变 3、联接 char *strcat(char *to,char *from);//将from串复制到to串的末尾, //并返回to串开始处的指针 【例】strcat(s3,/); //s3=dir/bin/appl/ strcat(s3,s2); //s3=dir/bin/appl/file.asm 4、串比较 int strcmp(char *s1,char *s2);//比较s1和s2的大小, //当s1s2、s1s2和s1=s2时,分别返回小于0、大于0和等于0的值 【例】result=strcmp(baker,Baker); //result0 result=strcmp(12,12); //result=0 result=strcmp(Joe,joseph) //result0 5、字符定位 char *strchr(char *s,char c);//找c在字符串s中第一次出现的位置, //若找到,则返回该位置,否则返回NULL 【例】p=strchr(s2,'.'); //p指向file之后的位置 if(p) strcpy(p,.cpp); //s2=file.cpp 注意:  ①上述操作是最基本的,其中后 4个操作还有变种形式:strncpy,strncath和strnchr。  ②其它的串操作见C的string.h。在不同的高级语言中,对串运算的种类及符号都不尽相同  ③其余的串操作一般可由这些基本操作组合而成 【例】求子串的操作可如下实现: void substr(char *sub,char *s,int pos,int len){ //s和sub是字符数组,用sub返回串s的第pos个字符起长度为len的子串 //其中0=pos=strlen(s)-1,且数组sub至少可容纳len+1个字符。 if (pos0||posstrlen(s)-1||len0) Error(parameter error!); strncpy(sub,s ,len); //从s 起复制至多len个字符到sub
个人分类: 科研资源|4455 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-5 17:15

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部