[Python黑帽] 一.获取Windows主机信息、注册表、U盘历史痕迹和回收站文件

最近开始学习网络安全和系统安全,接触到了很多新术语、新方法和新工具,作为一名初学者,感觉安全领域涉及的知识好广、好杂,但同时也非常有意思。这系列文章是作者学习安全过程中的总结和探索,我们一起去躺过那些坑、跨过那些洞、守住那些站,真心希望文章对您有所帮助,感谢您的阅读和关注。

Python黑帽第一篇文章将分享获取Windows主机信息,利用注册表获取主机名及USB历史痕迹、回收站文件等,这些知识广泛应用于电子取证、Web渗透和攻击溯源领域,其中USB获取是亮点。希望这篇基础文章对您有所帮助,更希望大家提高安全意识,学会相关防范,也欢迎大家讨论。娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。


声明:本人坚决反对利用教学方法进行恶意攻击的行为,一切错误的行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解技术背后的原理,更好地进行安全防护。虽然作者是一名安全小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在安全路上一起前行。



一.获取Windows主机信息

WMI(Windows Management Instrumentation) 是一项核心的Windows管理技术,WMI模块可用于获取Windows内部信息。WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程;设定一个在特定日期和时间运行的进程;远程启动计算机;获得本地或远程计算机的已安装程序列表;查询本地或远程计算机的Windows事件日志等等。

本文使用Python获取Windows系统上相关的信息可以使用WMI接口,安装调用PIP工具即可。

  • pip install wmi
  • import wmi

在这里插入图片描述

下面的代码是获取Windows主机相关信息。

import wmi
import os
import socket

w = wmi.WMI()

#获取电脑使用者信息
for CS in w.Win32_ComputerSystem():
    #print(CS)
    print("电脑名称: %s" %CS.Caption)
    print("使用者: %s" %CS.UserName)
    print("制造商: %s" %CS.Manufacturer)
    print("系统信息: %s" %CS.SystemFamily)
    print("工作组: %s" %CS.Workgroup)
    print("机器型号: %s" %CS.model)
    print("")

#获取操作系统信息
for OS in w.Win32_OperatingSystem():
    #print(OS)
    print("操作系统: %s" %OS.Caption)
    print("语言版本: %s" %OS.MUILanguages)
    print("系统位数: %s" %OS.OSArchitecture)
    print("注册人: %s" %OS.RegisteredUser)
    print("系统驱动: %s" %OS.SystemDevice)
    print("系统目录: %s" %OS.SystemDirectory)
    print("")

#获取电脑IP和MAC信息
for address in w.Win32_NetworkAdapterConfiguration(ServiceName = "e1dexpress"):
    #print(address)
    print("IP地址: %s" % address.IPAddress)
    print("MAC地址: %s" % address.MACAddress)
    print("网络描述: %s" % address.Description)
    print("")

#获取电脑CPU信息
for processor in w.Win32_Processor():
    #print(processor)
    print("CPU型号: %s" % processor.Name.strip())
    print("CPU核数: %s" % processor.NumberOfCores)
    print("")

#获取BIOS信息
for BIOS in w.Win32_BIOS():
    #print(BIOS)
    print("使用日期: %s" %BIOS.Description)
    print("主板型号: %s" %BIOS.SerialNumber)
    print("当前语言: %s" %BIOS.CurrentLanguage)
    print("")

#获取内存信息
for memModule in w.Win32_PhysicalMemory():
    totalMemSize = int(memModule.Capacity)
    print("内存厂商: %s" %memModule.Manufacturer)
    print("内存型号: %s" %memModule.PartNumber)
    print("内存大小: %.2fGB" %(totalMemSize/1024**3))
    print("")

#获取磁盘信息
for disk in w.Win32_DiskDrive():
    diskSize = int(disk.size)
    print("磁盘名称: %s" %disk.Caption)
    print("硬盘型号: %s" %disk.Model)
    print("磁盘大小: %.2fGB" %(diskSize/1024**3))

#获取显卡信息
for xk in w.Win32_VideoController():
    print("显卡名称: %s" %xk.name)
    print("")
       
#获取计算机名称和IP
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
print("计算机名称: %s" %hostname)
print("IP地址: %s" %ip)

输出结果如下图所示:

在这里插入图片描述

在这里插入图片描述



二.获取Windows注册表信息

1.注册表基本结构

注册表(Registry)是Windows系统中一个重要的数据库,它用于存储有关应用程序、用户和系统信息。注册表的结构就像一颗树,树的顶级节点(hive)不能添加、修改和删除,如下图所示是Windows注册表的顶级节点。

在这里插入图片描述

在C#中对注册表进行操作,需要引用命名空间using Microsoft.Win32。

  • RegistryKey类:表示注册表中的顶级结点,此类是注册表的封装。
  • Registry类:提供表示Windows注册表中的根项RegistryKey对象,并提供访问项/值的static方法。常用的Registry对象的顶级节点(蜂窝,hive)的属性如下表所示:

在这里插入图片描述

注册表中常用的数据类型有:

  • REG_SZ:字符串数据的主要类型,用于存储固定长度的字符串或其他短文本值。我们在实际程序中常用这种数据类型,如果要保存布尔值时,将它表示成0或1。
  • REG_BINARY:用于存储二进制数据。
  • REG_EXPAND_SZ:可扩展的字符串值,可以保存在运行时才解析的系统变量。
  • REG_MULTI_SZ:以数组的格式保存多个文本字符串,每个字符串"元素"都以null字符结束。


2.注册表基本操作

Python注册表操作主要调用winreg扩展包。官方文档如下:

基本操作函数如下:

(1) 创建操作

  • winreg.ConnectRegistry(computer_name, key)
    与计算机的预定义注册表句柄建立连接
  • winreg.CreateKey(key, sub_key)
    创建或打开指定的键

例如在HKEY_CURRENT_USER下创建键Eastmount,其中我们最常用的是在\Software这个键下创建程序产品键,保存一些程序的配置在注册表中。如果Software中没有Eastmount键,则会先创建这个键及其子键,如果存在就不会重写。

import winreg as wg

#创建键
subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)
wg.CreateKey(key_test, 'Eastmount')
wg.CloseKey(key_test)

运行结果如下:

在这里插入图片描述


(2) 检索键值操作

  • winreg.QueryInfoKey(key)
    以元组形式返回键的信息
  • winreg.QueryValue(key, sub_key)
    以字符串形式检索键的未命名值
  • winreg.QueryValueEx(key, value_name)
    检索与打开注册表项关联的指定值名称的类型和数据

在Eastmount下面新建一个值yxz,内容为“hello na”,然后编写代码读取相关的内容。

#获取键值数据项值
subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer\Eastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)
value,type_ = wg.QueryValueEx(key_test,'yxz')
print(value)
print(type_)

输出结果如下图所示:

在这里插入图片描述

在这里插入图片描述


(3) 创建键值操作

  • winreg.SetValue(key, sub_key, type, value)
    将值与指定的键关联
  • winreg.SetValueEx(key, value_name, reserved, type, value)
    将数据存储在打开的注册表项Value字段中

创建键值代码如下,但会提示PermissionError: [WinError 5] 拒绝访问错误。

#创建键值数据项
subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer\Eastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)
print(key_test)
#PermissionError: [WinError 5] 拒绝访问
wg.SetValueEx(key_test,'data','',wg.REG_SZ,'0') 
wg.CloseKey(key_test)

(4) 删除键值操作

  • winreg.DeleteKey(key, sub_key)
    删除指定的键
  • winreg.DeleteValue(key, value)
    从注册表项中删除值
#删除键值数据项
subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer\Eastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER,subDir,0,wg.KEY_WRITE)
wg.DeleteValue(key_test,'yxz')
wg.CloseKey(key_test)

成功删除键值,如下图所示。

在这里插入图片描述


(5) 其他操作

  • winreg.EnumKey(key, index)
    枚举打开注册表的键
  • winreg.EnumValue(key, index)
    枚举打开注册表项的值
  • winreg.OpenKey(key, sub_key,sam=KEY_READ)
    打开指定键
  • winreg.FlushKey(key)
    刷新注册表
  • winreg.LoadKey(key, sub_key, file_name)
    在指定键下创建一个子键,并将注册信息从指定文件存储到该子键中


3.获取用户账户信息

在这里插入图片描述

获取用户名称的代码如下:

# encoding:utf-8
from winreg import *
import sys

#连接注册表根键 以HKEY_LOCAL_MACHINE为例
regRoot = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
subDir = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'

#获取指定目录下所有键的控制
keyHandle = OpenKey(regRoot, subDir)

#获取该目录下所有键的个数(0-下属键个数 1-当前键值个数)
count = QueryInfoKey(keyHandle)[0]
for i in range(count):
    #穷举键获取键名
    subKeyName = EnumKey(keyHandle, i)
    subDir_2 = r'%s\%s' % (subDir, subKeyName)
    
    #根据获取的键名拼接之前的路径作为参数 获取当前键下所属键的控制
    keyHandle_2 = OpenKey(regRoot, subDir_2)
    num = QueryInfoKey(keyHandle_2)[1]
    for j in range(num):
        name, value, type_ = EnumValue(keyHandle_2, j)
        if('ProfileImagePath' in name and 'Users' in value):
            print(value)
    #读写操作结束后关闭键
    CloseKey(keyHandle_2)
    
CloseKey(keyHandle)
CloseKey(regRoot)

执行结果如下,我们可以通过读取含有Users字段的数据,从而间接获取用户账户信息。

C:\Users\xiuzhang


三.获取回收站内容

为什么我们要去获取回收站文件呢?因为很多情况下调查取证需要获取远程目标的历史痕迹,回收站是重要的一个目标。在Windows操作系统中,回收站是一个专门用来存放被删除文件的特色文件夹。

在使用FAT文件系统的Windows98系统中,回收站目录通常是C:\Recycled;在Windows NT2000、Windows XP在内支持的NTFS操作系统中,C:\Recycler;在Windows Vista和Windows7中,回收站目录是C:\$Recycle.Bin。如下图所示,回收站中包含两个文件,分别位于桌面和D盘目录。

在这里插入图片描述


第一步,检测回收站目录是否存在。

import os

def returnDir():
    #定义回收站目录
    dirs = ['C:\\Recycler\\', 'C:\\Recycled', 'C:\\$Recycle.Bin\\']
    for recycleDir in dirs:
        if os.path.isdir(recycleDir):
            return recycleDir
    return None

#调用函数
res = returnDir()
print(res) #C:\$Recycle.Bin\

Windows10操作系统输出结果如下图所示:

在这里插入图片描述

第二步,找到回收站之后,检测其中的内容,如下图所示,字符串SID与用户账户名是对应的,比如1001结尾的SID。

在这里插入图片描述

第三步,编写代码获取回收站文件夹所在目录。

import os

#判断回收站目录是否存在
def returnDir():
    dirs = ['C:\\Recycler\\', 'C:\\Recycled', 'C:\\$Recycle.Bin\\']
    for recycleDir in dirs:
        if os.path.isdir(recycleDir):
            return recycleDir
    return None

#获取回收站内容
def findRecycle(recycleDir):
    dirList = os.listdir(recycleDir)
    for sid in dirList:
        print(sid)
        files = os.listdir(recycleDir+sid)
        print(files,"\n")

#主函数
def main():
    res = returnDir()
    print(res) #C:\$Recycle.Bin\
    findRecycle(res)
    
if __name__ == '__main__':
    main()

输出结果如下图所示:

在这里插入图片描述

第四步,用python将用户的SID关联起来,使用Windows注册表将SID转化为一个准确的用户名。

  • 通过检查Windows注册表键值
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\ProfileImagePath

编写一个函数来将每一个SID转化为用户名,这个函数将打开注册便检查ProfileImagePath键值,找到其值并从中找到用户名。

在这里插入图片描述

如下图所示,用户名为“xiuzhang”。

在这里插入图片描述

第五步,获取回收站所有内容。
完整代码:

import os
import winreg

#判断回收站目录是否存在
def returnDir():
    dirs = ['C:\\Recycler\\', 'C:\\Recycled', 'C:\\$Recycle.Bin\\']
    for recycleDir in dirs:
        if os.path.isdir(recycleDir):
            return recycleDir
    return None

#通过sid获取用户名信息
def sid2user(sid):
    try:
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,
                                "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\\" + sid)
        #获取该目录下所有键的个数: 0-下属键个数; 1-当前键值个数
        count = winreg.QueryInfoKey(key)[1] 
        for j in range(count):
            #FileNotFoundError: [WinError 2] 系统找不到指定的文件
            #(value, type) = winreg.QueryValue(key, 'ProfileImagePath')
            name, value, type = winreg.EnumValue(key, j)
            if('ProfileImagePath' in name):
                user = value.split('\\')[-1]
                #print(user)
        return user
    except:
        return sid

#获取回收站内容
def findRecycle(recycleDir):
    dirList = os.listdir(recycleDir)
    for sid in dirList:
        print(sid)
        files = os.listdir(recycleDir+sid)
        print(files)
        user = sid2user(sid)
        print('[*]Listing Files For User:' + str(user))
        for file in files:
            print('[+]Found File:' + str(file))
        print("")

#主函数
def main():
    res = returnDir()
    print(res)             #C:\$Recycle.Bin
    findRecycle(res)
    
if __name__ == '__main__':
    main()

输出结果如下图所示:

在这里插入图片描述

对应的回收站内容如下,但非常可惜获取的值无法对应,why?后续作者会继续深入挖掘。

在这里插入图片描述
在这里插入图片描述



如果我们想把文件删除到回收站,又怎么解决呢?Python删除文件一般使用os.remove,但这样是直接删除文件,不删到回收站的,那么想删除文件到回收站怎么办?

(1) 安装pypiwin32扩展包(含win32api)。

在这里插入图片描述

(2) 调用SHFileOperation函数实现删除文件至回收站。

在Windows的shellapi文件中定义了一个名为SHFileOperation的外壳函数,用它可以实现各种文件操作,如文件的拷贝、删除、移动等,该函数使用起来非常简单,它只有一个指向SHFILEOPSTRUCT结构的参数。

from win32com.shell import shell,shellcon
import os

debug = False
def deltoreCyclebin(filename):
    #直接删除文件,不经过回收站
    #os.remove(filename) 
    if not debug:
        #删除文件到回收站
        res = shell.SHFileOperation((0,
                                     shellcon.FO_DELETE,
                                     filename,
                                     None,
                                     shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION,
                                     None,
                                     None))
        print(res)
        if not res[1]:
            os.system('del '+ filename)

if __name__ == '__main__':
    filename = "C:\\Users\\xiuzhang\\Desktop\\require.rb"
    deltoreCyclebin(filename)

最终效果如下图所示,可以看到require.rb文件被成功删除。

在这里插入图片描述

可能会遇到“PermissionError: [WinError 5] 拒绝访问”问题,我们需要设置Python.exe用户名完全控制,并且用管理员方式打开即可解决。

在这里插入图片描述



四.获取U盘痕迹

在Windows系统中,当一个USB移动存储设备插入时,就会在注册表中留下痕迹。当移动设备插入计算机时,即插即用管理器PnP(Plug and Play)接受该事件,并且在USB设备的固件(Firewre information)中查询有关该设备的描述信息(厂商、型号、序列号等)。当设备被识别后,在注册表中创建一个新的键值:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR

在这个键值下,会看到类似下面的结构子键,该子键代表设备类标示符,用来标识设备的一个特定类。

  • Disk&Ven_###&Prod_###&Rev_###

其中,子键中"###"代表区域由PnP管理器依据在USB设备描述符中获取的数据填写。如下图所示:

  • Disk&Ven_aigo&Prod_Miniking&Rev_8.07是Device class ID
  • Q0UKCH37&0是Unique instance ID(UID)

在这里插入图片描述

注意需要判断Service值为disk,即为磁盘的子项,光盘为cdrom。

在这里插入图片描述

如果使用UVCView工具可以看见USB设备描述内容,其中的信息都是相互对应的。设备类ID一旦建立,就需要建立一个特定唯一的UID,它可以把具有同一设备类标识的多个存储设备区分。

完整实现代码如下:

# encoding:utf-8
from winreg import *
import sys

usb_name = []
uid_flag = []
usb_path = []

#连接注册表根键 以HKEY_LOCAL_MACHINE为例
regRoot = ConnectRegistry(None, HKEY_LOCAL_MACHINE)

#检索子项
subDir = r"SYSTEM\CurrentControlSet\Enum\USBSTOR"

#获取指定目录下所有键的控制
keyHandle = OpenKey(regRoot, subDir)

#获取该目录下所有键的个数(0-下属键个数 1-当前键值个数)
count = QueryInfoKey(keyHandle)[0]
print(count)

#穷举USBSTOR键获取键名
for i in range(count):
    subKeyName = EnumKey(keyHandle, i)
    subDir_2 = r'%s\%s' % (subDir, subKeyName)
    #print(subDir_2)

    #根据获取的键名拼接之前的路径作为参数 获取当前键下所属键的控制
    keyHandle_2 = OpenKey(regRoot, subDir_2)
    num = QueryInfoKey(keyHandle_2)[0]
    #遍历子键内容
    for j in range(num):
        subKeyName_2 = EnumKey(keyHandle_2, j)
        #print(subKeyName_2)
        result_path = r'%s\%s' % (subDir_2, subKeyName_2)

        #获取具体键值内容并判断Service为disk
        keyHandle_3 = OpenKey(regRoot, result_path)
        numKey = QueryInfoKey(keyHandle_3)[1]
        for k in range(numKey):
            #获取USB名称
            name, value, type_ = EnumValue(keyHandle_3, k)
            if(('Service' in name) and ('disk'in value)):
                value,type_ = QueryValueEx(keyHandle_3,'FriendlyName')
                usb = value
                uid = subKeyName_2
                path = "USBSTOR" + "\\" + subKeyName + "\\" + subKeyName_2
                print(usb)
                print(uid)
                print(path)                
                print("")
    
#关闭键值
CloseKey(keyHandle)
CloseKey(regRoot)

输出的USB记录键名如下图所示:

在这里插入图片描述

其中对应的注册表信息如下图所示,FriendlyName即是输出的“USB名称 Kingston DataTraveler 2.0 USB Device”,UID序号为“C860008862F1EE501A0F0105&0”,搜索的Service(服务)为disk(磁盘)的选项。

在这里插入图片描述


简单总结:

个人感觉这方面的资料真心很少,文章博客也少,所以看起来操作似乎很简单,但真正实现起来还是令人深思的。然后就是其实存储USB记录的还有很多键值,如

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
    该键值中能看到厂商号(VID_)、厂商产品号(PID_),还有LocationInformation(端口号) Port_#0001.Hub_#0005等。

在这里插入图片描述

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses
    该键值下有两个设备类:{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}{53F5630d-B6BF-11D0-94F2-00A0C91EFB8B},可以通过他们获取USB最后接入系统时间。

接下来我想要完成的就是如何把这些键值联系起来,似乎要通过Dictionary<string, UInfo>,同时怎样获取时间,怎样正确删除这些信息都值得深究。



五.总结

这篇文章真的花费了一些精力,希望您喜欢。同时感觉自己要学习的知识好多,也有好多大神卧虎藏龙,开源分享。作为初学者,我们可能有差距,不论你之前是什么方向,是什么工作,是什么学历,是大学大专中专,亦或是高中初中,只要你喜欢安全,喜欢渗透,就朝着这个目标去努力吧!有差距不可怕,我们需要的是去缩小差距,去战斗,况且这个学习的历程真的很美,安全真的有意思。但切勿去做坏事,我们需要的是白帽子,是维护我们的网络,安全路上共勉。

最后,真诚地感谢您关注“娜璋之家”公众号,也希望我的文章能陪伴你成长,希望在技术路上不断前行。文章如果对你有帮助、有感悟,就是对我最好的回报,且看且珍惜!再次感谢您的关注,也请帮忙宣传下“娜璋之家”,哈哈~初来乍到,还请多多指教。

独在异乡为异客,
每逢佳节倍思亲。

(By:Eastmount 2020-09-04 夜于武汉 https://blog.csdn.net/Eastmount)


参考文献:
[1]《Python绝技运用Python成为顶级黑客》TJ.O Connor
[2] Python wmi模块获取windows内部信息 - minger_lcm
[3] SHFileOperation的用法 - xiaodai0
[4] https://blog.csdn.net/Eastmount/article/details/108020041
[5] C# 系统应用之注册表使用详解 - Eastmount
[6] https://docs.python.org/2/library/_winreg.html
[7] 《计算机信息获取系统的研究与实现》论文

  • 74
    点赞
  • 380
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
含本书PDF教程 共399个实例: 第1章 窗体与界面设计   1.1 菜单应用实例   cc实例001 在系统菜单中添加菜单项   cc实例002 带图标的程序菜单   cc实例003 根据表中数据动态生成菜单   cc实例004 浮动的菜单   1.2 弹出菜单应用实例   cc实例005 在控件上单击右键弹出菜单   cc实例006 个性化的弹出菜单   cc实例007 任务栏托盘弹出菜单   1.3 工具栏应用实例   cc实例008 带背景的工具栏   cc实例009 带图标的工具栏   cc实例010 带下拉菜单的工具栏   cc实例011 可调整按钮位置的工具栏   cc实例012 浮动工具栏   cc实例013 根据表中数据动态生成工具栏   cc实例014 具有提示功能的工具栏   1.4 状态栏应用实例   cc实例015 带进度条的状态栏   cc实例016 动画效果的状态栏   cc实例017 滚动字幕的状态栏   1.5 导航界面应用实例   cc实例018 Outlook导航界面   cc实例019 树状导航界面   cc实例020 按钮导航界面   cc实例021 类QQ导航菜单   1.6 界面窗体应用实例   cc实例022 背景为渐变色的程序界面   cc实例023 椭圆形的程序界面   cc实例024 自绘窗体界面   cc实例025 类似WindowscXP的程序界面   cc实例026 窗体融合技术   cc实例027 限制对话框最大时的窗口大小   1.7 多媒体宣传光盘应用实例   cc实例028 多媒体宣传光盘主界面   cc实例029 自动运行的多媒体宣传光盘   1.8 多媒体触摸屏程序应用实例   cc实例030 采购中心多媒体触摸屏程序   cc实例031 为触摸屏程序添加虚拟键盘   1.9 窗体位置应用实例   cc实例032 不可移动的窗体   cc实例033 始终在最上面的窗体   cc实例034 动画显示窗体   cc实例035 以时钟显示界面窗体   1.10 窗体标题栏应用实例   cc实例036 闪烁的窗体标题栏   cc实例037 拖动没有标题栏的窗体   cc实例038 禁用标题栏上的最大化.c最小化或关闭按钮   1.11 窗体形状及应用   cc实例039 半透明窗体   cc实例040 创建字型窗体   cc实例041 百叶窗窗体   cc实例042 类似Office助手  第2章 控件应用   2.1 按钮控件典型实例   cc实例043 AVI动画按钮   cc实例044 GIF动画按钮   cc实例045 图文按钮   cc实例046 不规则按钮   2.2 EditBox控件典型实例   cc实例047 为EditBox设置新的系统菜单   cc实例048 为EditBox控件添加列表选择框   cc实例049 多彩边框的编辑框   cc实例050 改变编辑框文本颜色   2.3 ListBox控件典型实例   cc实例051 利用ListBox控件实现标签式数据选择   cc实例052 在ListBox控件间实现数据交换   cc实例053 列表项的提示条   2.4 ComboBox控件典型实例   cc实例054 将数据表中的字段添加到ComboBox控件   cc实例055 带查询功能的ComboBox控件   cc实例056 自动调整组合框的宽度   cc实例057 颜色组合框   cc实例058 多列显示的组合框   2.5 ListControl控件典型实例   cc实例059 将数据库中的数据表添加到ListControl控件   cc实例060 利用ListControl控件浏览数据   cc实例061 利用ListControl控件制作导航界面   cc实例062 在列表视图中拖动视图项   cc实例063 利用列标题对列表视图进行数据排序   cc实例064 具有文本录入功能的ListControl控件   2.6 TreeControl控件典型实例   cc实例065 多级数据库树状结构数据显示   cc实例066 可动态修改节点的树状结构   cc实例067 带复选功能的树状结构   cc实例068 显示磁盘目录   cc实例069 树型提示框   2.7 RichEdit控件典型实例   cc实例070 利用RichEdit显示Word文档   cc实例071 利用RichEdit控件实现文字定位与标识   cc实例072 利用RichEdit控件显示图文数据   2.8 图形类控件典型实例   cc实例073 图文数据录入   cc实例074 带有滚动条的图形控件   2.9 滚动条控件典型实例   cc实例075 自定义滚动条控件   2.10 控件数组典型实例   cc实例076 向窗体中动态添加控件  cc 实例077 公交线路模拟  第3章 图形技术   3.1 绘制图形   cc实例078 绘制正弦曲线   cc实例079 绘制艺术图案   cc实例080 画图程序   cc实例081 绘制立体模型   cc实例082 利用IFS算法绘制自然景物   3.2 图像预览   cc实例083 图片自动预览程序   cc实例084 图片批量浏览   cc实例085 浏览大幅BMP图片   cc实例086 放大和缩小图片   cc实例087 可随鼠标移动的图形   cc实例088 随图像大小变换的图像浏览器   3.3 图片效果   cc实例089 图片马赛克效果   cc实例090 图片百叶窗效果   cc实例091 电影胶片特效   cc实例092 翻转图片效果   3.4 图片颜色转换   cc实例093 图像的锐化处理   cc实例094 图片反色处理   cc实例095 图像的灰度化转换   cc实例096 显示JPG图片   3.5 图形转换与缩放   cc实例097 将位图转换为JPG   cc实例098 将位图转为GIF图标   cc实例099 图片的平滑缩放   3.6 图像的剪切与合成   cc实例100 图像的剪切   cc实例101 图像的合成  3.7 图像识别   cc实例102 获取鼠标任意位置的颜色值   cc实例103 提取图片中的对象   cc实例104 手写数字识别   3.8 图像字体  cc 实例105 旋转的文字   cc实例106 当前系统字体列表   cc实例107 空心文字   cc实例108 如何在图片上平滑移动文字   3.9 图像管理   cc实例109 管理计算机内图片文件的程序   cc实例110 提取并保存应用程序图标   3.10 图片动画   cc实例111 利用图片制作屏幕保护程序   cc实例112 图片动画   3.11 简单游戏设计   cc实例113 拼图游戏   cc实例114 网络五子棋   cc实例115 彩票抽奖机   3.12 OpenGL程序设计   cc实例116 制作OpenGL动画   cc实例117 利用OpenGL绘制立体模型   cc实例118 利用OpenGL绘制NURBS曲线  第4章 多媒体技术   4.1 动画   cc实例119 利用Image控件制作小动画   cc实例120 透明的Flash动画   cc实例121 播放GIF动画   cc实例122 播放AVI动画   cc实例123 播放VCD   4.2 制作与播放音频   cc实例124 可以选择播放曲目的CD播放器   cc实例125 MP3播放器   cc实例126 声音录制与播放   cc实例127 制作RealOne播放器   4.3 多媒体控制   cc实例128 部队早起军号程序   cc实例129 利用PC喇叭播放声音   cc实例130 c控制左右声道   4.4 屏幕保护相关程序   cc实例131 电子相册屏幕保护程序   cc实例132 产品宣传屏幕保护程序   4.5 DirectShow程序设计   cc实例133 音频捕捉   cc实例134 视频捕捉  第5章 文件系统   5.1 文件的基本操作   cc实例135 创建和删除文件夹   cc实例136 把文件删除到回收站中   cc实例137 清空回收站   5.2 查找文件   cc实例138 搜索文件   cc实例139 检查文件是否存在   cc实例140 提取指定文件夹目录到INI文件   5.3 与文件目录相关的命令操作   cc实例141 删除文件目录   cc实例142 重命名文件目录   5.4 文件.c文件夹的复制和移动   cc实例143 批量移动文件   cc实例144 网络文件夹复制   cc实例145 文件复制过程中显示进度条   5.5 文件修改   cc实例146 更改文件夹图标   cc实例147 批量删除指定类型的文件   cc实例148 批量重命名文件   cc实例149 修改文件属性   cc实例150 修改文件及目录的名称   5.6 文件的读取与保存   cc实例151 顺序读取文件   cc实例152 制作日志文件   5.7 文件管理   cc实例153 分类整理磁盘文件   cc实例154 计算机磁盘空间报警程序   cc实例155 批量改变指定文件的属性   5.8 加密与解密   cc实例156 文件的加密与解密   cc实例157 文件夹加密   5.9 其他文件管理知识   cc实例158 文件分割器   cc实例159 帮助文件   cc实例160 用WinRar压缩和解压文件   cc实例161 判断文件是否被改动   第6章 操作系统与Windows相关程序   6.1 启动相关设置   cc实例162 进入WindowscXP前发出警告   cc实例163 实现关机.c重启计算机   cc实例164 将程序设置成为开机自动执行的程序   6.2 磁盘相关设置   cc实例165 判断驱动器属性   cc实例166 获取磁盘空间信息   cc实例167 获取磁盘序列号   cc实例168 取消磁盘共享   cc实例169 格式化磁盘   6.3 桌面相关设置   cc实例170 隐藏.c显示“开始”按钮   cc实例171 隐藏.c显示桌面文件   cc实例172 隐藏.c显示Windows任务栏   6.4 系统相关设置   cc实例173 获得Windows和System的路径   cc实例174 控制光驱的弹开与关闭   cc实例175 启动控制面板   cc实例176 为程序添加快捷键   6.5 系统监控   cc实例177 检测系统启动模式   cc实例178 内存使用状态   cc实例179 监视剪贴板内容   cc实例180 利用钩子技术实现键盘监控   6.6 程序相关设置   cc实例181 用列表显示系统正在运行的程序   cc实例182 为程序添加快捷方式   cc实例183 设置其他程序中编辑框内的文本   cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用临界区实现线程同步   cc实例189 用信号量实现线程同步   cc实例190 多线程cc实例   6.8 鼠标.c键盘相关设置   cc实例191 动画鼠标   cc实例192 限制鼠标移动区域  第7章 注册表   7.1 显示与隐藏  cc 实例193 隐藏.c显示“我的电脑”.c“回收站”.c“网上邻居”   cc实例194 隐藏.c显示驱动器   7.2 IE设置   cc实例195 修改IE标题栏内容   cc实例196 隐藏IE浏览器的右键关联菜单   cc实例197 设置IE的默认主页   cc实例198 清空上网历史记录   7.3 文件控制   cc实例199 如何建立文件关联   cc实例200 控制光驱的自动运行功能   7.4 游戏设置   cc实例201 设置“蜘蛛纸牌”游戏   cc实例202 修改“扫雷”游戏的设置   7.5 应用软件设置   cc实例203 设置Wordc2000文档及图片的保存路径   cc实例204 更改Photoshop安装时的登记信息  第8章 数据库技术   8.1 连接数据库   cc实例205 使用ODBCcDSN连接SQLcServer数据库   cc实例206 用ADO动态连接数据库   cc实例207c连接Oracle数据库   8.2 添加数据   cc实例208 利用INSERT语句批量插入数据   cc实例209 利用SELECTcINTO生成临时表   8.3 更新数据   cc实例210 批量修改数据   cc实例211 将指定字段数据为空的记录添上数据   8.4 删除数据   cc实例212 删除单条数据   cc实例213 删除数据库中无用处的记录   8.5 视图   cc实例214 动态创建视图   cc实例215 通过视图更改数据   cc实例216 删除视图   8.6 触发器   cc实例217 创建触发器   cc实例218 在程序中使用触发器   8.7 存储过程   cc实例219 创建存储过程   cc实例220 删除存储过程   cc实例221 在程序中使用存储过程   cc实例222 调用具有输出参数的存储过程   8.8 数据库结构的读取与修改   cc实例223 读取Access数据库结构   cc实例224 读取SQLcServer数据库结构   8.9 图片.c多媒体数据录入技术   cc实例225 对Access数据库进行录入和提取图片   cc实例226 对SQLServer数据库进行录入和提取多媒体文件   cc实例227 对SQLcServer数据库进行录入和存储Word文档   8.10 数据备份恢复   cc实例228 Access数据库备份与还原   cc实例229 SQLcServer数据库备份与恢复   cc实例230 定时数据备份   8.11 其他数据库技术    实例231 断开SQLcServer数据库与其他应用程序的连接   cc实例232 在VisualcC++中执行事务   cc实例233 在程序中执行SQL脚本   cc实例234 利用SQL语句执行外围命令  第9章 SQL查询相关技术   9.1 通用查询   cc实例235 SQL语句的应用方法   cc实例236 SQL语句的模糊查询   cc实例237 利用查询语句复制表结构   9.2 查询控件   cc实例238 查询指定控件内字符串   cc实例239 查询日期控件内数据   cc实例240 控件作为字段.c操作符和内容进行查询   cc实例241 巧妙获取年龄   cc实例242 格式化金额   cc实例243 如何随机显示记录   9.3 查询前若干名数据   cc实例244 查询前10名数据   cc实例245 取出数据统计结果前3名数据   9.4 周期.c日期查询   cc实例246 查询指定日期的数据   cc实例247 查询指定时间段的数据   cc实例248 按月查询数据   9.5 大小比较.c逻辑查询.c重复记录查询   cc实例249 查询数据大于指定条件的数据   cc实例250 NOT与谓词进行组合条件的查询   cc实例251 查询时不显示重复记录   9.6 排序.c分组统计   cc实例252 对数据进行降序查询   cc实例253 对数据进行多条件排序   cc实例254 按仓库分组统计图书库存(多列)   cc实例255 多表分组统计   9.7 HAVING语句应用   cc实例256 利用HAVING语句过滤分组数据   cc实例257 将HAVING语句应用在多表查询中   9.8 聚集函数   cc实例258 利用聚集函数SUM对销售额进行汇总   cc实例259 利用聚集函数AVG求某班学生的平均年龄   cc实例260 利用聚集函数COUNT求日销售额大于某值的商品数   9.9 多表查询   cc实例261 利用FROM子句进行多表查询   cc实例262 合并多个结果集   9.10 嵌套查询   cc实例263 简单嵌套查询   cc实例264 复杂嵌套查询   9.11 子查询   cc实例265 用子查询作派生的表   cc实例266 把子查询作为表达式   cc实例267 在UPDATE语句中应用子查询   9.12 联合语句UNION   cc实例268 使用联合查询   cc实例269 多表联合查询   cc实例270 对联合查询后的结果进行排序   9.13 内连接查询   cc实例271 简单内连接查询   cc实例272 复杂内连接查询   cc实例273 使用内连接选择一个表与另一个表中行相关的所有行   9.14 外连接查询   cc实例274 LEFTcOUTERcJOIN查询   cc实例275 RIGHTcOUTERcJOIN查询   cc实例276 使用外连接进行多表联合查询   9.15 利用IN进行查询   cc实例277 使用IN引入子查询限定查询范围   cc实例278 用IN查询表中的记录信息   9.16 交叉表查询   cc实例279 利用TRANSFORM分析数据   cc实例280 利用TRANSFORM动态分析数据   cc实例281 静态交叉表(SQLcServerc2000)   cc实例282 动态交叉表(SQLcServerc2000)   9.17 函数查询   cc实例283 在查询语句中使用字符串函数   cc实例284 在查询中使用日期函数   cc实例285 在查询时为表中的空字段添加默认信息  第10章 打印与报表技术   10.1 基础报表打印   cc实例286 基于文档/视图结构的打印   cc实例287 基于对话框结构的打印程序   10.2 打印窗体   cc实例288 打印对话框及其控件中的数据   cc实例289 打印对话框文本   10.3 打印图片   cc实例290 打印图片   cc实例291 打印简历   10.4 利用报表生成器设计报表   cc实例292 简单报表   cc实例293 分组统计报表   cc实例294 主明细报表   10.5 打印邮寄单   cc实例295 打印汇款单   cc实例296 打印信封标签   10.6 打印证件   cc实例297 批量打印工作证   cc实例298 批量打印证书   10.7 打印单据   cc实例299 库存盘点单打印   cc实例300 连续纸销售单打印   cc实例301 发票打印   10.8 打印条形码和标签   cc实例302 批量打印条形码   cc实例303 打印连续号码的标签   10.9 其他格式报表打印   cc实例304 将DataGrid表格中的查询结果输出到Excel中   cc实例305 利用Word打印   cc实例306 利用Excel打印   10.10 控制打印   cc实例307 打印超长字符串自动换行   cc实例308 批量打印文档   cc实例309 实现横向打印   cc实例310 设置打印纸大小   cc实例311 获取打印纸的左边距和上边距   10.11 打印预览   cc实例312 修改文档/视图结构默认的打印预栏工具栏   cc实例313 自定义具有滚动条的打印预览窗口  第11章 图表技术   11.1 简单图表   cc实例314 利用图表分析产品价格行情   cc实例315 对图表数据进行打印   11.2 柱形图表   cc实例316 将汇总数据利用图表分析   cc实例317 对比数据分析   11.3 饼形图表   cc实例318 饼形图分析公司男女比例   cc实例319 商品日销售额图表分析  第12章 硬件相关开发技术   12.1 串口控制   cc实例320 通过串口传递数据   cc实例321 通过串口控制对方计算机关闭   12.2 加密狗   cc实例322 将密码写入加密狗   cc实例323 使用加密狗进行身份验证   12.3 IC卡的应用   cc实例324 向IC卡中写入数据   cc实例325 读取IC卡中的数据   cc实例326 利用IC卡制作考勤程序   12.4 监控   cc实例327 利用简易摄像头编写监控程序   cc实例328 编写监控录像程序   cc实例329 定时监控程序   cc实例330 医疗行业数字视频监控系统   cc实例331 远程视频监控系统   12.5 扫描.c条形码.cPOS控制   cc实例332 利用条形码扫描器销售商品   cc实例333 设计钱箱控制程序   cc实例334 设计扫描仪控制程序   cc实例335 设计发票机控制程序   12.6 语音卡控制   cc实例336 语音卡电话呼叫系统   cc实例337 语音卡实现来电显示   cc实例338 利用语音卡实现电话录音   cc实例339 利用语音卡实现点歌祝福   12.7 手机程序的开发   cc实例340 利用短信猫发送短信   cc实例341 利用短信远程关闭计算机   12.8 其他程序   cc实例342 利用神龙卡制作练歌房程序  第13章 网络开发技术   13.1 获取计算机信息   cc实例343 获取计算机名称和工作组  cc 实例344 通过计算机名获取IP地址   cc实例345 获取本机MAC地址   cc实例346 获得系统打开的端口和状态   13.2 局域网控制与管理   cc实例347 获取局域网中的计算机名称和IP地址   cc实例348 远程控制局域网中的计算机   13.3 局域网资源管理   cc实例349 局域网屏幕监控   cc实例350 提取局域网信息到数据库   13.4 网上资源共享   cc实例351 获得网上共享资源   cc实例352 映射网络驱动器   cc实例353 定时网络共享控制   13.5 网络连接与通信   cc实例354 编程实现ping操作   cc实例355 网络语音电话   cc实例356 网络流量监控   cc实例357 取得Modem的状态   cc实例358 检测TCP/IP是否安装   cc实例359 实现进程间的通信   cc实例360 利用内存映射实现进程间的通信   13.6 局域网应用   cc实例361 局域网聊天程序   cc实例362 网上调查   13.7 其他   cc实例363 获得拨号网络的列表   cc实例364 获取计算机上串口的数量   cc实例365 检测系统中安装的协议   cc实例366 域名解析  第14章 Web编程   14.1 上网控制   cc实例367 定时登录Internet   cc实例368 根据网络连接控制IE启动   14.2 文件上传与下载   cc实例369 FTP文件上传程序   cc实例370 利用VisualcC++实现软件下载   cc实例371 HTTP服务器多线程文件下载   14.3 邮件管理   cc实例372 邮件接收程序  cc 实例373 发送电子邮件附件   14.4 上网监控   cc实例374 监控上网过程   cc实例375 网络监听工具   14.5 浏览器应用   cc实例376 制作自己的网络浏览软件   cc实例377 XML数据库文档的浏览   14.6 网上信息提取   cc实例378 定时提取网页源码   cc实例379 网上天气预报   cc实例380 网页链接提取器   14.7 其他   cc实例381 利用TAPI实现网络拨号  第15章 加密.c安全与软件注册   15.1 数据加密与解密   cc实例382 数据加密技术   cc实例383 文本文件的加密与解密  cc 实例384 利用图片加密文件   15.2 Access数据库安全   cc实例385 编程修复Access数据库   cc实例386 对数据库中的表锁定和解锁   cc实例387 改变Accessc2000数据库头文件来加密数据库   15.3 软件注册与加密   cc实例388 利用INI文件对软件进行注册   cc实例389 利用注册表设计软件注册程序   cc实例390 利用网卡序列号设计软件注册程序   cc实例391 根据CPU序列号和磁盘序列号设计软件注册程序   15.4 计算机安全   cc实例392 设置计算机的安全等级  第16章 实用工具   16.1 数据库工具   cc实例393 自动配置ODBC的程序   cc实例394 制作SQLcServer提取器   cc实例395 自动附加SQLcServer数据库   16.2 个人工具   cc实例396 个人通讯录   cc实例397 电子名片盒   16.3 单位应用   cc实例398 局域网投票管理   cc实例399 加班网上管理 
文件分为2部分 part1 = http://download.csdn.net/source/2362571 含本书全部源码(1-16章) 共399个实例:第1章 窗体与界面设计  1.1 菜单应用实例  cc实例001 在系统菜单中添加菜单项  cc实例002 带图标的程序菜单   cc实例003 根据表中数据动态生成菜单  cc实例004 浮动的菜单  1.2 弹出菜单应用实例  cc实例005 在控件上单击右键弹出菜单  cc实例006 个性化的弹出菜单  cc实例007 任务栏托盘弹出菜单  1.3 工具栏应用实例  cc实例008 带背景的工具栏  cc实例 009 带图标的工具栏  cc实例010 带下拉菜单的工具栏  cc实例011 可调整按钮位置的工具栏  cc实例012 浮动工具栏  cc实例 013 根据表中数据动态生成工具栏  cc实例014 具有提示功能的工具栏  1.4 状态栏应用实例  cc实例015 带进度条的状态栏  cc 实例016 动画效果的状态栏  cc实例017 滚动字幕的状态栏  1.5 导航界面应用实例  cc实例018 Outlook导航界面  cc实例019 树状导航界面  cc实例020 按钮导航界面  cc实例021 类QQ导航菜单  1.6 界面窗体应用实例  cc实例022 背景为渐变色的程序界面  cc实例023 椭圆形的程序界面  cc实例024 自绘窗体界面  cc实例025 类似WindowscXP的程序界面  cc 实例026 窗体融合技术  cc实例027 限制对话框最大时的窗口大小  1.7 多媒体宣传光盘应用实例  cc实例028 多媒体宣传光盘主界面  cc实例029 自动运行的多媒体宣传光盘  1.8 多媒体触摸屏程序应用实例  cc实例030 采购中心多媒体触摸屏程序  cc实例031 为触摸屏程序添加虚拟键盘  1.9 窗体位置应用实例  cc实例032 不可移动的窗体  cc实例033 始终在最上面的窗体  cc实例034 动画显示窗体  cc实例035 以时钟显示界面窗体  1.10 窗体标题栏应用实例  cc实例036 闪烁的窗体标题栏  cc实例037 拖动没有标题栏的窗体  cc实例038 禁用标题栏上的最大化.c最小化或关闭按钮  1.11 窗体形状及应用  cc实例039 半透明窗体  cc实例 040 创建字型窗体  cc实例041 百叶窗窗体  cc实例042 类似Office助手 第2章 控件应用  2.1 按钮控件典型实例  cc 实例043 AVI动画按钮  cc实例044 GIF动画按钮  cc实例045 图文按钮  cc实例046 不规则按钮  2.2 EditBox 控件典型实例  cc实例047 为EditBox设置新的系统菜单  cc实例048 为EditBox控件添加列表选择框  cc实例049 多彩边框的编辑框  cc实例050 改变编辑框文本颜色  2.3 ListBox控件典型实例  cc实例051 利用ListBox控件实现标签式数据选择  cc实例052 在ListBox控件间实现数据交换  cc实例053 列表项的提示条  2.4 ComboBox控件典型实例  cc实例 054 将数据表中的字段添加到ComboBox控件  cc实例055 带查询功能的ComboBox控件  cc实例056 自动调整组合框的宽度  cc实例057 颜色组合框  cc实例058 多列显示的组合框  2.5 ListControl控件典型实例  cc实例059 将数据库中的数据表添加到ListControl控件  cc实例060 利用ListControl控件浏览数据  cc实例061 利用ListControl控件制作导航界面  cc实例062 在列表视图中拖动视图项  cc实例063 利用列标题对列表视图进行数据排序  cc实例064 具有文本录入功能的 ListControl控件  2.6 TreeControl控件典型实例  cc实例065 多级数据库树状结构数据显示  cc实例066 可动态修改节点的树状结构  cc实例067 带复选功能的树状结构  cc实例068 显示磁盘目录  cc实例069 树型提示框  2.7  RichEdit控件典型实例  cc实例070 利用RichEdit显示Word文档  cc实例071 利用RichEdit控件实现文字定位与标识  cc实例072 利用RichEdit控件显示图文数据  2.8 图形类控件典型实例  cc实例073 图文数据录入  cc实例074 带有滚动条的图形控件  2.9 滚动条控件典型实例  cc实例075 自定义滚动条控件  2.10 控件
含本书教程PDF 共399个实例: 第1章 窗体与界面设计   1.1 菜单应用实例   cc实例001 在系统菜单中添加菜单项   cc实例002 带图标的程序菜单   cc实例003 根据表中数据动态生成菜单   cc实例004 浮动的菜单   1.2 弹出菜单应用实例   cc实例005 在控件上单击右键弹出菜单   cc实例006 个性化的弹出菜单   cc实例007 任务栏托盘弹出菜单   1.3 工具栏应用实例   cc实例008 带背景的工具栏   cc实例009 带图标的工具栏   cc实例010 带下拉菜单的工具栏   cc实例011 可调整按钮位置的工具栏   cc实例012 浮动工具栏   cc实例013 根据表中数据动态生成工具栏   cc实例014 具有提示功能的工具栏   1.4 状态栏应用实例   cc实例015 带进度条的状态栏   cc实例016 动画效果的状态栏   cc实例017 滚动字幕的状态栏   1.5 导航界面应用实例   cc实例018 Outlook导航界面   cc实例019 树状导航界面   cc实例020 按钮导航界面   cc实例021 类QQ导航菜单   1.6 界面窗体应用实例   cc实例022 背景为渐变色的程序界面   cc实例023 椭圆形的程序界面   cc实例024 自绘窗体界面   cc实例025 类似WindowscXP的程序界面   cc实例026 窗体融合技术   cc实例027 限制对话框最大时的窗口大小   1.7 多媒体宣传光盘应用实例   cc实例028 多媒体宣传光盘主界面   cc实例029 自动运行的多媒体宣传光盘   1.8 多媒体触摸屏程序应用实例   cc实例030 采购中心多媒体触摸屏程序   cc实例031 为触摸屏程序添加虚拟键盘   1.9 窗体位置应用实例   cc实例032 不可移动的窗体   cc实例033 始终在最上面的窗体   cc实例034 动画显示窗体   cc实例035 以时钟显示界面窗体   1.10 窗体标题栏应用实例   cc实例036 闪烁的窗体标题栏   cc实例037 拖动没有标题栏的窗体   cc实例038 禁用标题栏上的最大化.c最小化或关闭按钮   1.11 窗体形状及应用   cc实例039 半透明窗体   cc实例040 创建字型窗体   cc实例041 百叶窗窗体   cc实例042 类似Office助手  第2章 控件应用   2.1 按钮控件典型实例   cc实例043 AVI动画按钮   cc实例044 GIF动画按钮   cc实例045 图文按钮   cc实例046 不规则按钮   2.2 EditBox控件典型实例   cc实例047 为EditBox设置新的系统菜单   cc实例048 为EditBox控件添加列表选择框   cc实例049 多彩边框的编辑框   cc实例050 改变编辑框文本颜色   2.3 ListBox控件典型实例   cc实例051 利用ListBox控件实现标签式数据选择   cc实例052 在ListBox控件间实现数据交换   cc实例053 列表项的提示条   2.4 ComboBox控件典型实例   cc实例054 将数据表中的字段添加到ComboBox控件   cc实例055 带查询功能的ComboBox控件   cc实例056 自动调整组合框的宽度   cc实例057 颜色组合框   cc实例058 多列显示的组合框   2.5 ListControl控件典型实例   cc实例059 将数据库中的数据表添加到ListControl控件   cc实例060 利用ListControl控件浏览数据   cc实例061 利用ListControl控件制作导航界面   cc实例062 在列表视图中拖动视图项   cc实例063 利用列标题对列表视图进行数据排序   cc实例064 具有文本录入功能的ListControl控件   2.6 TreeControl控件典型实例   cc实例065 多级数据库树状结构数据显示   cc实例066 可动态修改节点的树状结构   cc实例067 带复选功能的树状结构   cc实例068 显示磁盘目录   cc实例069 树型提示框   2.7 RichEdit控件典型实例   cc实例070 利用RichEdit显示Word文档   cc实例071 利用RichEdit控件实现文字定位与标识   cc实例072 利用RichEdit控件显示图文数据   2.8 图形类控件典型实例   cc实例073 图文数据录入   cc实例074 带有滚动条的图形控件   2.9 滚动条控件典型实例   cc实例075 自定义滚动条控件   2.10 控件数组典型实例   cc实例076 向窗体中动态添加控件  cc 实例077 公交线路模拟  第3章 图形技术   3.1 绘制图形   cc实例078 绘制正弦曲线   cc实例079 绘制艺术图案   cc实例080 画图程序   cc实例081 绘制立体模型   cc实例082 利用IFS算法绘制自然景物   3.2 图像预览   cc实例083 图片自动预览程序   cc实例084 图片批量浏览   cc实例085 浏览大幅BMP图片   cc实例086 放大和缩小图片   cc实例087 可随鼠标移动的图形   cc实例088 随图像大小变换的图像浏览器   3.3 图片效果   cc实例089 图片马赛克效果   cc实例090 图片百叶窗效果   cc实例091 电影胶片特效   cc实例092 翻转图片效果   3.4 图片颜色转换   cc实例093 图像的锐化处理   cc实例094 图片反色处理   cc实例095 图像的灰度化转换   cc实例096 显示JPG图片   3.5 图形转换与缩放   cc实例097 将位图转换为JPG   cc实例098 将位图转为GIF图标   cc实例099 图片的平滑缩放   3.6 图像的剪切与合成   cc实例100 图像的剪切   cc实例101 图像的合成  3.7 图像识别   cc实例102 获取鼠标任意位置的颜色值   cc实例103 提取图片中的对象   cc实例104 手写数字识别   3.8 图像字体  cc 实例105 旋转的文字   cc实例106 当前系统字体列表   cc实例107 空心文字   cc实例108 如何在图片上平滑移动文字   3.9 图像管理   cc实例109 管理计算机内图片文件的程序   cc实例110 提取并保存应用程序图标   3.10 图片动画   cc实例111 利用图片制作屏幕保护程序   cc实例112 图片动画   3.11 简单游戏设计   cc实例113 拼图游戏   cc实例114 网络五子棋   cc实例115 彩票抽奖机   3.12 OpenGL程序设计   cc实例116 制作OpenGL动画   cc实例117 利用OpenGL绘制立体模型   cc实例118 利用OpenGL绘制NURBS曲线  第4章 多媒体技术   4.1 动画   cc实例119 利用Image控件制作小动画   cc实例120 透明的Flash动画   cc实例121 播放GIF动画   cc实例122 播放AVI动画   cc实例123 播放VCD   4.2 制作与播放音频   cc实例124 可以选择播放曲目的CD播放器   cc实例125 MP3播放器   cc实例126 声音录制与播放   cc实例127 制作RealOne播放器   4.3 多媒体控制   cc实例128 部队早起军号程序   cc实例129 利用PC喇叭播放声音   cc实例130 c控制左右声道   4.4 屏幕保护相关程序   cc实例131 电子相册屏幕保护程序   cc实例132 产品宣传屏幕保护程序   4.5 DirectShow程序设计   cc实例133 音频捕捉   cc实例134 视频捕捉  第5章 文件系统   5.1 文件的基本操作   cc实例135 创建和删除文件夹   cc实例136 把文件删除到回收站中   cc实例137 清空回收站   5.2 查找文件   cc实例138 搜索文件   cc实例139 检查文件是否存在   cc实例140 提取指定文件夹目录到INI文件   5.3 与文件目录相关的命令操作   cc实例141 删除文件目录   cc实例142 重命名文件目录   5.4 文件.c文件夹的复制和移动   cc实例143 批量移动文件   cc实例144 网络文件夹复制   cc实例145 文件复制过程中显示进度条   5.5 文件修改   cc实例146 更改文件夹图标   cc实例147 批量删除指定类型的文件   cc实例148 批量重命名文件   cc实例149 修改文件属性   cc实例150 修改文件及目录的名称   5.6 文件的读取与保存   cc实例151 顺序读取文件   cc实例152 制作日志文件   5.7 文件管理   cc实例153 分类整理磁盘文件   cc实例154 计算机磁盘空间报警程序   cc实例155 批量改变指定文件的属性   5.8 加密与解密   cc实例156 文件的加密与解密   cc实例157 文件夹加密   5.9 其他文件管理知识   cc实例158 文件分割器   cc实例159 帮助文件   cc实例160 用WinRar压缩和解压文件   cc实例161 判断文件是否被改动   第6章 操作系统与Windows相关程序   6.1 启动相关设置   cc实例162 进入WindowscXP前发出警告   cc实例163 实现关机.c重启计算机   cc实例164 将程序设置成为开机自动执行的程序   6.2 磁盘相关设置   cc实例165 判断驱动器属性   cc实例166 获取磁盘空间信息   cc实例167 获取磁盘序列号   cc实例168 取消磁盘共享   cc实例169 格式化磁盘   6.3 桌面相关设置   cc实例170 隐藏.c显示“开始”按钮   cc实例171 隐藏.c显示桌面文件   cc实例172 隐藏.c显示Windows任务栏   6.4 系统相关设置   cc实例173 获得Windows和System的路径   cc实例174 控制光驱的弹开与关闭   cc实例175 启动控制面板   cc实例176 为程序添加快捷键   6.5 系统监控   cc实例177 检测系统启动模式   cc实例178 内存使用状态   cc实例179 监视剪贴板内容   cc实例180 利用钩子技术实现键盘监控   6.6 程序相关设置   cc实例181 用列表显示系统正在运行的程序   cc实例182 为程序添加快捷方式   cc实例183 设置其他程序中编辑框内的文本   cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用临界区实现线程同步   cc实例189 用信号量实现线程同步   cc实例190 多线程cc实例   6.8 鼠标.c键盘相关设置   cc实例191 动画鼠标   cc实例192 限制鼠标移动区域  第7章 注册表   7.1 显示与隐藏  cc 实例193 隐藏.c显示“我的电脑”.c“回收站”.c“网上邻居”   cc实例194 隐藏.c显示驱动器   7.2 IE设置   cc实例195 修改IE标题栏内容   cc实例196 隐藏IE浏览器的右键关联菜单   cc实例197 设置IE的默认主页   cc实例198 清空上网历史记录   7.3 文件控制   cc实例199 如何建立文件关联   cc实例200 控制光驱的自动运行功能   7.4 游戏设置   cc实例201 设置“蜘蛛纸牌”游戏   cc实例202 修改“扫雷”游戏的设置   7.5 应用软件设置   cc实例203 设置Wordc2000文档及图片的保存路径   cc实例204 更改Photoshop安装时的登记信息  第8章 数据库技术   8.1 连接数据库   cc实例205 使用ODBCcDSN连接SQLcServer数据库   cc实例206 用ADO动态连接数据库   cc实例207c连接Oracle数据库   8.2 添加数据   cc实例208 利用INSERT语句批量插入数据   cc实例209 利用SELECTcINTO生成临时表   8.3 更新数据   cc实例210 批量修改数据   cc实例211 将指定字段数据为空的记录添上数据   8.4 删除数据   cc实例212 删除单条数据   cc实例213 删除数据库中无用处的记录   8.5 视图   cc实例214 动态创建视图   cc实例215 通过视图更改数据   cc实例216 删除视图   8.6 触发器   cc实例217 创建触发器   cc实例218 在程序中使用触发器   8.7 存储过程   cc实例219 创建存储过程   cc实例220 删除存储过程   cc实例221 在程序中使用存储过程   cc实例222 调用具有输出参数的存储过程   8.8 数据库结构的读取与修改   cc实例223 读取Access数据库结构   cc实例224 读取SQLcServer数据库结构   8.9 图片.c多媒体数据录入技术   cc实例225 对Access数据库进行录入和提取图片   cc实例226 对SQLServer数据库进行录入和提取多媒体文件   cc实例227 对SQLcServer数据库进行录入和存储Word文档   8.10 数据备份恢复   cc实例228 Access数据库备份与还原   cc实例229 SQLcServer数据库备份与恢复   cc实例230 定时数据备份   8.11 其他数据库技术    实例231 断开SQLcServer数据库与其他应用程序的连接   cc实例232 在VisualcC++中执行事务   cc实例233 在程序中执行SQL脚本   cc实例234 利用SQL语句执行外围命令  第9章 SQL查询相关技术   9.1 通用查询   cc实例235 SQL语句的应用方法   cc实例236 SQL语句的模糊查询   cc实例237 利用查询语句复制表结构   9.2 查询控件   cc实例238 查询指定控件内字符串   cc实例239 查询日期控件内数据   cc实例240 控件作为字段.c操作符和内容进行查询   cc实例241 巧妙获取年龄   cc实例242 格式化金额   cc实例243 如何随机显示记录   9.3 查询前若干名数据   cc实例244 查询前10名数据   cc实例245 取出数据统计结果前3名数据   9.4 周期.c日期查询   cc实例246 查询指定日期的数据   cc实例247 查询指定时间段的数据   cc实例248 按月查询数据   9.5 大小比较.c逻辑查询.c重复记录查询   cc实例249 查询数据大于指定条件的数据   cc实例250 NOT与谓词进行组合条件的查询   cc实例251 查询时不显示重复记录   9.6 排序.c分组统计   cc实例252 对数据进行降序查询   cc实例253 对数据进行多条件排序   cc实例254 按仓库分组统计图书库存(多列)   cc实例255 多表分组统计   9.7 HAVING语句应用   cc实例256 利用HAVING语句过滤分组数据   cc实例257 将HAVING语句应用在多表查询中   9.8 聚集函数   cc实例258 利用聚集函数SUM对销售额进行汇总   cc实例259 利用聚集函数AVG求某班学生的平均年龄   cc实例260 利用聚集函数COUNT求日销售额大于某值的商品数   9.9 多表查询   cc实例261 利用FROM子句进行多表查询   cc实例262 合并多个结果集   9.10 嵌套查询   cc实例263 简单嵌套查询   cc实例264 复杂嵌套查询   9.11 子查询   cc实例265 用子查询作派生的表   cc实例266 把子查询作为表达式   cc实例267 在UPDATE语句中应用子查询   9.12 联合语句UNION   cc实例268 使用联合查询   cc实例269 多表联合查询   cc实例270 对联合查询后的结果进行排序   9.13 内连接查询   cc实例271 简单内连接查询   cc实例272 复杂内连接查询   cc实例273 使用内连接选择一个表与另一个表中行相关的所有行   9.14 外连接查询   cc实例274 LEFTcOUTERcJOIN查询   cc实例275 RIGHTcOUTERcJOIN查询   cc实例276 使用外连接进行多表联合查询   9.15 利用IN进行查询   cc实例277 使用IN引入子查询限定查询范围   cc实例278 用IN查询表中的记录信息   9.16 交叉表查询   cc实例279 利用TRANSFORM分析数据   cc实例280 利用TRANSFORM动态分析数据   cc实例281 静态交叉表(SQLcServerc2000)   cc实例282 动态交叉表(SQLcServerc2000)   9.17 函数查询   cc实例283 在查询语句中使用字符串函数   cc实例284 在查询中使用日期函数   cc实例285 在查询时为表中的空字段添加默认信息  第10章 打印与报表技术   10.1 基础报表打印   cc实例286 基于文档/视图结构的打印   cc实例287 基于对话框结构的打印程序   10.2 打印窗体   cc实例288 打印对话框及其控件中的数据   cc实例289 打印对话框文本   10.3 打印图片   cc实例290 打印图片   cc实例291 打印简历   10.4 利用报表生成器设计报表   cc实例292 简单报表   cc实例293 分组统计报表   cc实例294 主明细报表   10.5 打印邮寄单   cc实例295 打印汇款单   cc实例296 打印信封标签   10.6 打印证件   cc实例297 批量打印工作证   cc实例298 批量打印证书   10.7 打印单据   cc实例299 库存盘点单打印   cc实例300 连续纸销售单打印   cc实例301 发票打印   10.8 打印条形码和标签   cc实例302 批量打印条形码   cc实例303 打印连续号码的标签   10.9 其他格式报表打印   cc实例304 将DataGrid表格中的查询结果输出到Excel中   cc实例305 利用Word打印   cc实例306 利用Excel打印   10.10 控制打印   cc实例307 打印超长字符串自动换行   cc实例308 批量打印文档   cc实例309 实现横向打印   cc实例310 设置打印纸大小   cc实例311 获取打印纸的左边距和上边距   10.11 打印预览   cc实例312 修改文档/视图结构默认的打印预栏工具栏   cc实例313 自定义具有滚动条的打印预览窗口  第11章 图表技术   11.1 简单图表   cc实例314 利用图表分析产品价格行情   cc实例315 对图表数据进行打印   11.2 柱形图表   cc实例316 将汇总数据利用图表分析   cc实例317 对比数据分析   11.3 饼形图表   cc实例318 饼形图分析公司男女比例   cc实例319 商品日销售额图表分析  第12章 硬件相关开发技术   12.1 串口控制   cc实例320 通过串口传递数据   cc实例321 通过串口控制对方计算机关闭   12.2 加密狗   cc实例322 将密码写入加密狗   cc实例323 使用加密狗进行身份验证   12.3 IC卡的应用   cc实例324 向IC卡中写入数据   cc实例325 读取IC卡中的数据   cc实例326 利用IC卡制作考勤程序   12.4 监控   cc实例327 利用简易摄像头编写监控程序   cc实例328 编写监控录像程序   cc实例329 定时监控程序   cc实例330 医疗行业数字视频监控系统   cc实例331 远程视频监控系统   12.5 扫描.c条形码.cPOS控制   cc实例332 利用条形码扫描器销售商品   cc实例333 设计钱箱控制程序   cc实例334 设计扫描仪控制程序   cc实例335 设计发票机控制程序   12.6 语音卡控制   cc实例336 语音卡电话呼叫系统   cc实例337 语音卡实现来电显示   cc实例338 利用语音卡实现电话录音   cc实例339 利用语音卡实现点歌祝福   12.7 手机程序的开发   cc实例340 利用短信猫发送短信   cc实例341 利用短信远程关闭计算机   12.8 其他程序   cc实例342 利用神龙卡制作练歌房程序  第13章 网络开发技术   13.1 获取计算机信息   cc实例343 获取计算机名称和工作组  cc 实例344 通过计算机名获取IP地址   cc实例345 获取本机MAC地址   cc实例346 获得系统打开的端口和状态   13.2 局域网控制与管理   cc实例347 获取局域网中的计算机名称和IP地址   cc实例348 远程控制局域网中的计算机   13.3 局域网资源管理   cc实例349 局域网屏幕监控   cc实例350 提取局域网信息到数据库   13.4 网上资源共享   cc实例351 获得网上共享资源   cc实例352 映射网络驱动器   cc实例353 定时网络共享控制   13.5 网络连接与通信   cc实例354 编程实现ping操作   cc实例355 网络语音电话   cc实例356 网络流量监控   cc实例357 取得Modem的状态   cc实例358 检测TCP/IP是否安装   cc实例359 实现进程间的通信   cc实例360 利用内存映射实现进程间的通信   13.6 局域网应用   cc实例361 局域网聊天程序   cc实例362 网上调查   13.7 其他   cc实例363 获得拨号网络的列表   cc实例364 获取计算机上串口的数量   cc实例365 检测系统中安装的协议   cc实例366 域名解析  第14章 Web编程   14.1 上网控制   cc实例367 定时登录Internet   cc实例368 根据网络连接控制IE启动   14.2 文件上传与下载   cc实例369 FTP文件上传程序   cc实例370 利用VisualcC++实现软件下载   cc实例371 HTTP服务器多线程文件下载   14.3 邮件管理   cc实例372 邮件接收程序  cc 实例373 发送电子邮件附件   14.4 上网监控   cc实例374 监控上网过程   cc实例375 网络监听工具   14.5 浏览器应用   cc实例376 制作自己的网络浏览软件   cc实例377 XML数据库文档的浏览   14.6 网上信息提取   cc实例378 定时提取网页源码   cc实例379 网上天气预报   cc实例380 网页链接提取器   14.7 其他   cc实例381 利用TAPI实现网络拨号  第15章 加密.c安全与软件注册   15.1 数据加密与解密   cc实例382 数据加密技术   cc实例383 文本文件的加密与解密  cc 实例384 利用图片加密文件   15.2 Access数据库安全   cc实例385 编程修复Access数据库   cc实例386 对数据库中的表锁定和解锁   cc实例387 改变Accessc2000数据库头文件来加密数据库   15.3 软件注册与加密   cc实例388 利用INI文件对软件进行注册   cc实例389 利用注册表设计软件注册程序   cc实例390 利用网卡序列号设计软件注册程序   cc实例391 根据CPU序列号和磁盘序列号设计软件注册程序   15.4 计算机安全   cc实例392 设置计算机的安全等级  第16章 实用工具   16.1 数据库工具   cc实例393 自动配置ODBC的程序   cc实例394 制作SQLcServer提取器   cc实例395 自动附加SQLcServer数据库   16.2 个人工具   cc实例396 个人通讯录   cc实例397 电子名片盒   16.3 单位应用   cc实例398 局域网投票管理   cc实例399 加班网上管理 
Visual C++程序开发范例宝典配套光盘,因大小受限,所以分成8部分上传,必须全部下载才能正常解压! 第1章 窗体与界面设计 1.1 菜单应用实例 实例001 在系统菜单中添加菜单项 实例002 带图标的程序菜单 实例003 根据表中数据动态生成菜单 实例004 浮动的菜单 1.2 弹出菜单应用实例 实例005 在控件上单击右键弹出菜单 实例006 个性化的弹出菜单 实例007 任务栏托盘弹出菜单 1.3 工具栏应用实例 实例008 带背景的工具栏 实例009 带图标的工具栏 实例010 带下拉菜单的工具栏 实例011 可调整按钮位置的工具栏 实例012 浮动工具栏 实例013 根据表中数据动态生成工具栏 实例014 具有提示功能的工具栏 1.4 状态栏应用实例 实例015 带进度条的状态栏 实例016 动画效果的状态栏 实例017 滚动字幕的状态栏 1.5 导航界面应用实例 实例018 Outlook导航界面 实例019 树状导航界面 实例020 按钮导航界面 实例021 类QQ导航菜单 1.6 界面窗体应用实例 实例022 背景为渐变色的程序界面 实例023 椭圆形的程序界面 实例024 自绘窗体界面 实例025 类似Windows XP的程序界面 实例026 窗体融合技术 实例027 限制对话框最大时的窗口大小 1.7 多媒体宣传光盘应用实例 实例028 多媒体宣传光盘主界面 实例029 自动运行的多媒体宣传光盘 1.8 多媒体触摸屏程序应用实例 实例030 采购中心多媒体触摸屏程序 实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 实例032 不可移动的窗体 实例033 始终在最上面的窗体 实例034 动画显示窗体 实例035 以时钟显示界面窗体 1.10 窗体标题栏应用实例 实例036 闪烁的窗体标题栏 实例037 拖动没有标题栏的窗体 实例038 禁用标题栏上的最大化、最小化或关闭按钮 1.11 窗体形状及应用 实例039 半透明窗体 实例040 创建字型窗体 实例041 百叶窗窗体 实例042 类似Office助手 第2章 控件应用 2.1 按钮控件典型实例 实例043 AVI动画按钮 实例044 GIF动画按钮 实例045 图文按钮 实例046 不规则按钮 2.2 EditBox控件典型实例 实例047 为EditBox设置新的系统菜单 实例048 为EditBox控件添加列表选择框 实例049 多彩边框的编辑框 实例050 改变编辑框文本颜色 2.3 ListBox控件典型实例 实例051 利用ListBox控件实现标签式数据选择 实例052 在ListBox控件间实现数据交换 实例053 列表项的提示条 2.4 ComboBox控件典型实例 实例054 将数据表中的字段添加到ComboBox控件 实例055 带查询功能的ComboBox控件 实例056 自动调整组合框的宽度 实例057 颜色组合框 实例058 多列显示的组合框 2.5 ListControl控件典型实例 实例059 将数据库中的数据表添加到ListControl控件 实例060 利用ListControl控件浏览数据 实例061 利用ListControl控件制作导航界面 实例062 在列表视图中拖动视图项 实例063 利用列标题对列表视图进行数据排序 实例064 具有文本录入功能的ListControl控件 2.6 TreeControl控件典型实例 实例065 多级数据库树状结构数据显示 实例066 可动态修改节点的树状结构 实例067 带复选功能的树状结构 实例068 显示磁盘目录 实例069 树型提示框 2.7 RichEdit控件典型实例 实例070 利用RichEdit显示Word文档 实例071 利用RichEdit控件实现文字定位与标识 实例072 利用RichEdit控件显示图文数据 2.8 图形类控件典型实例 实例073 图文数据录入 实例074 带有滚动条的图形控件 2.9 滚动条控件典型实例 实例075 自定义滚动条控件 2.10 控件数组典型实例 实例076 向窗体中动态添加控件 实例077 公交线路模拟 第3章 图形技术 3.1 绘制图形 实例078 绘制正弦曲线 实例079 绘制艺术图案 实例080 画图程序 实例081 绘制立体模型 实例082 利用IFS算法绘制自然景物 3.2 图像预览 实例083 图片自动预览程序 实例084 图片批量浏览 实例085 浏览大幅BMP图片 实例086 放大和缩小图片 实例087 可随鼠标移动的图形 实例088 随图像大小变换的图像浏览器 3.3 图片效果 实例089 图片马赛克效果 实例090 图片百叶窗效果 实例091 电影胶片特效 实例092 翻
好的,我来为您解答。 首先,我们需要导入相关的库。 ```python import cv2 import numpy as np ``` 然后,读取一幅灰度图像。 ```python img = cv2.imread('gray_image.jpg', 0) ``` 接下来,使用基于梯度的方法来获取边缘。 ```python # Sobel算子 sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) sobel = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0) # Scharr算子 scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0) scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1) scharr = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0) # Laplacian算子 laplacian = cv2.Laplacian(img, cv2.CV_64F) ``` 然后,使用形态学的方法来获取边缘。 ```python # 膨胀 kernel = np.ones((3, 3), np.uint8) dilation = cv2.dilate(img, kernel, iterations=1) # 腐蚀 erosion = cv2.erode(img, kernel, iterations=1) # 开运算 opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 闭运算 closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) # 梯度 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) # 顶帽 tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # 黑帽 blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) ``` 最后,将原图像和所得到的边缘图像显示出来。 ```python cv2.imshow('Original Image', img) cv2.imshow('Sobel Edge', sobel) cv2.imshow('Scharr Edge', scharr) cv2.imshow('Laplacian Edge', laplacian) cv2.imshow('Dilation', dilation) cv2.imshow('Erosion', erosion) cv2.imshow('Opening', opening) cv2.imshow('Closing', closing) cv2.imshow('Gradient', gradient) cv2.imshow('Tophat', tophat) cv2.imshow('Blackhat', blackhat) cv2.waitKey(0) cv2.destroyAllWindows() ``` 至此,我们就完成了一幅灰度图像的边缘和轮廓的获取,并且使用基于梯度的方法和形态学的方法分别实现了这一过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值