主頁 > 後端開發 > python+opencv實作機器視徑訓礎技術(2)(寬度測量,缺陷檢測,醫學處理)

python+opencv實作機器視徑訓礎技術(2)(寬度測量,缺陷檢測,醫學處理)

2020-10-03 07:26:14 後端開發

??本篇博客接著講解機器視覺的有關技術和知識,包括寬度測量,缺陷檢測,醫學處理,

一:寬度測量

??在傳統的自動化生產中,對于尺寸的測量,典型的方法就是千分尺、游標卡尺、塞尺等,而這些測量手段測量精度低、速度慢,無法滿足大規模的自動化生產需求,基于機器視覺的尺寸測量屬于非接觸式的測量,具有檢測精度高、速度快、成本低、安裝簡便等優點,可以檢測零件的各種尺寸,如長度、圓、角度、線弧等測量,

??利用python+opencv方法可以進行寬度的測量,步驟是先選取出一個矩形,然后進行閾值分割,再進行反色,邊緣提取之后進行點的選擇,輸出坐標做出兩條線段,根據線段進行矩形繪制,這樣之后就可以計算兩條直線之間的距離,也就是我們需要求得的寬度,

??OpenCV是一個c++庫,用于實時處理計算機視覺方面的問題,涵蓋了很多計算機視覺領域的模塊,配合python呼叫c++庫,可以很方便地進行寬度測量,實作要求,

??步驟如下:

1.匯入需要的庫

import cv2
import cv2 as cv
import numpy as np
import imutils

2.讀取原影像查看

img = cv2.imread("1.jpg")

3.截取部分影像

??手動地進行選取我們感興趣的部分,然后截取出來,

img = imutils.resize(img, width=500)
roi = cv2.selectROI(windowName="image1", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
s = img[y:y+h,x:x+w]

4.反色

??截取后會出現空白區域很多黑色的情況,需要進行反色,用到的方法是255去除值,

# 反色
def colorReverse(src):
	height, width, channels = src.shape
	for row in range(height):
	    for list in range(width):
	        for c in range(channels):
	            pv = src[row, list, c]
	            src[row, list, c] = 255 - pv
	return src
src = https://www.cnblogs.com/ITXiaoAng/p/colorReverse(s)

5.邊緣檢測去噪

x = cv2.Sobel(src,cv2.CV_16S,1,0)
y = cv2.Sobel(src,cv2.CV_16S,0,1)
absX = cv2.convertScaleAbs(x)   # 轉回uint8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
result = colorReverse(dst)

6.輸出滑鼠選擇點的坐標

??之后進行的操作是利用滑鼠選擇點,并顯示坐標,可以判斷時候用滑鼠進行點擊操作,如果是的話,就可以輸出點的坐標在輸出框或者圖片上標記,把點擊函式作為引數,就可以在不點擊退出鍵的時候進行回圈遞回操作,知道最直到獲得想要點的坐標,

# 輸出滑鼠選擇點的坐標
# setMouseCallback使用的回呼函式,這個回呼函式在捕獲到滑鼠左鍵點擊事件時,就在圖片上點擊處繪制一個實心的圓、并顯示出坐標,
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        xy = "%d,%d" % (x, y)
        print (xy)
        cv2.circle(result, (x, y), 1, (255, 0, 0), thickness = -1)
        cv2.putText(result, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
                    1.0, (0,0,0), thickness = 1)
        cv2.imshow("image2", result)

cv2.namedWindow("image2")
cv2.setMouseCallback("image2", on_EVENT_LBUTTONDOWN)
cv2.imshow("image2", result)

7.繪制線段用輸出提示

??接下來就可以根據選擇的四個點進行連接輸出線段,用get_len()方法可以得到兩條線之間的距離,

# 繪制線段
s = cv2.line(result,(3, 30), (120, 30), (0, 255, 0), 2)
d = cv2.line(result,(3, 110), (118, 110), (0,255, 0), 2)
lens = s.get_len() - d.get_len()

# 輸出圖形
text = "寬為:{0}".format(lens)
cv.putText(result, text, (20, 20), cv.FONT_HERSHEY_COMPLEX, 2.0, (0, 255, 0), 1)


二:缺陷檢測

??缺陷檢測通常是指對物品表面缺陷的檢測,表面缺陷檢測是采用先進的機器視覺檢測技術,對工件表面的斑點、凹坑、劃痕、色差、缺損等缺陷進行檢測,

??人工檢測是產品表面缺陷的傳統檢測方法,該方法抽檢率低、準確性不高、實時性差、效率低、勞動強度大、受人工經驗和主觀因素的影響大,而基于機器視覺的檢測方法可以很大程度上克服上述弊端,

??缺陷檢測被廣泛使用于布匹瑕疵檢測、工件表面質量檢測、航空航天領域等,傳統的演算法對規則缺陷以及場景比較簡單的場合,能夠很好作業,但是對特征不明顯的、形狀多樣、場景比較混亂的場合,則不再適用,近年來,基于深度學習的識別演算法越來越成熟,許多公司開始嘗試把深度學習演算法應用到工業場合中,

??視覺表面缺陷檢測系統基本組成主要包括影像獲取模塊、影像處理模塊、影像分析模塊、資料管理及人機介面模塊,

??這里是用python+opencv進行津彩啤酒的圖片缺陷檢測,將0.bmp圖片進行樣本,和其他圖片進行對比,檢測是否合格,通過對比原圖和要比較的影像的24位灰度影像進行檢測,

??步驟如下:

1.匯入需要的庫

import cv2
import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont

2.比較

??讀入我們0.bmp影像作為比較因子,設定為rgbimage_std變數

rgbimage_std = cv.imread("0.bmp")

3.轉換

??將24位rgbimage_std彩色影像轉換為8位rgb2grayimage_std灰度影像

rgb2grayimage_std = cv2.cvtColor(rgbimage_std, cv2.COLOR_RGB2GRAY)

4.回圈

??缺陷檢測演算法回圈六次,

imagename = str(i) + '.bmp'
	rgbimage_defect = cv.imread(imagename)
	# 將每次imagename對應影像在影像視窗顯示出來
	# cv.imshow(imagename, rgbimage_defect)

	# 將24位rgbimage_defect彩色影像轉換8位rgb2grayimage_defect灰度圖
	gray = np.array(rgbimage_defect)
	gray = gray[:,:,0]
	rgb2grayimage_defect = np.array([gray,gray,gray])
	rgb2grayimage_defect = np.transpose(rgb2grayimage_defect,(1,2,0))

	name = str(i) + '_rgb2grayimage_defect.bmp'
	# cv.imshow(name, rgb2grayimage_defect)

	# 缺陷比較
	# 直方圖計算的函式,反應灰度值的分布情況
	be_compare_image = cv2.calcHist([rgb2grayimage_std], [0], None, [256], [0.0,255.0])
	compare_image = cv2.calcHist([rgb2grayimage_defect], [0], None, [256], [0.0,255.0])

	#相關性計算,采用相關系數的方式
	# result = cv2.compareHist(be_compare_image,compare_image,method=cv2.HISTCMP_CORREL)
	result = sum(be_compare_image - compare_image)[0]
	# 打開PIL創建的影像
	ss = Image.open(str(i) + ".bmp")
	# 創建一個操作物件
	draw = ImageDraw.Draw(ss)
	# 字體物件為simsun,字大小為50號
	fnt = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', 50)
	# 如果圖片對比原圖相似度小于7,則合格;否則不合格,
	if result < 7:
	    draw.text((5, 10), u'合格', fill='red', font=fnt)
th_str = str(i) + '.bmp'
	draw.text((5, 350), th_str, fill='red', font=fnt)
	else:
	    draw.text((5, 10), u'不合格', fill='red', font=fnt)
th_str = str(i) + '.bmp'
draw.text((5, 350), th_str, fill='red', font=fnt)
	ss.show("result" +str(i) + ".png")







5.結束代碼

cv.waitKey(0)

三:醫學檢測

??醫學資訊處理,即對醫學資訊的處理,醫學資訊處理程序中借助計算機技術,具有非常高的應用價值,在提高資訊處理準確度的同時,也極大地增強了資訊處理的效率,為廣大患者與患者家屬創造更為人性化的就醫環境,

??利用計算機的先進技術可以對醫學影像進行處理,然后更加方便地得到圖片上蘊含的資訊,從而進行正快速地得到我們想要得到的資訊,

??這里是用python+opencv進行醫學影像識別,借助計算機技術幫助醫生對醫學影像進行有效地分析,

??步驟如下:

1.匯入庫

from skimage import data,color,morphology
import cv2 as cv
import cv2

2.讀入灰度圖

img1 = cv.imread('vas0.bmp',0)

3.反色

img3 = img2.copy()
cv2.threshold(img2,80,255,0,img2)
for i in range(0,img2.shape[0]):
    for j in range(0,img2.shape[1]):
        img3[i,j] = 255-img2[i,j]

??或者如下代碼:

# 對img2影像影像進行反色,得到img3影像
def access_pixels(image):
    height, width, channels = image.shape
    for row in range(height):
        for list in range(width):
            for c in range(channels):
                pv = image[row, list, c]
                image[row, list, c] = 255 - pv
    return image
img3 = access_pixels(img2)


4.擴展

img4 = cv2.copyMakeBorder(img3,50,50,50,50,cv2.BORDER_REFLECT)

5.去噪

??去除噪聲位置地小面積區域,可以有兩種方式,一種是選擇滿足面積150-10000的img4影像輸出,去除噪聲位置元素,另一種是使用Skimage中的形態學處理來進行孤立小區域的去除,

img5 = morphology.remove_small_holes(img4, 100)

??或者如下代碼:

contours,hierarchy  = cv2.findContours(img4, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
#消除小面積
for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    if area < 150:
        cv2.drawContours(img4,[contours[i]],0,0,-1)
img5 = img4

6.面積濾波

??用連通區域的面積除以連通區域包絡盒的面積,僅保留當這個比值小于用戶所給的div的值時的連通區域,

img5=img5.copy()
contours1,hierarchy = cv2.findContours(img5, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for j in range(len(contours1)):
area1 = cv2.contourArea(contours1[j])
print(area1)
if area1 ==157.0:
    cv2.drawContours(img5,[contours1[j]],0,0,-1)
elif area1==261.5:
    cv2.drawContours(img5,[contours1[j]],0,0,-1)
elif area1==568.0:
    cv2.drawContours(img5,[contours1[j]],0,0,-1)

7.細化函式

??輸入需要細化的圖片(經過二值化處理的圖片)和映射矩陣array,并提取骨架,

def Thin(image, array):
    h, w = image.shape
    iThin = image

    for i in range(h):
        for j in range(w):
            if image[i, j] == 0:
                a = [1] * 9
                for k in range(3):
                    for l in range(3):
                        # 如果3*3矩陣的點不在邊界且這些值為零,也就是黑色的點
                        if -1 < (i - 1 + k) < h and -1 < (j - 1 + l) < w and iThin[i - 1 + k, j - 1 + l] == 0:
                            a[k * 3 + l] = 0
                sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128
                iThin[i, j] = array[sum] * 255
    return iThin
# 映射表
array = [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\
         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\
         1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1,\
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\
         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,\
         1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0]
src = https://www.cnblogs.com/ITXiaoAng/p/cv2.imread(r'img5.png', 0)
Gauss_img = cv2.GaussianBlur(src, (3,3), 0)
# 自適應二值化函式,需要修改的是55那個位置的數字,越小越精細,細節越好,噪點更多,最大不超過圖片大小
adap_binary = cv2.adaptiveThreshold(Gauss_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,2)
img6 = Thin(adap_binary, array)

8.邊緣檢測

img7 = cv2.Canny(img6,80,255)

9.圖片反色

img8 = img7.copy()
cv2.threshold(img7,80,255,0,img7)
for i in range(0,img7.shape[0]):
    for j in range(0,img7.shape[1]):
        img8[i,j] = 255-img7[i,j]

10.結束函式

cv.waitKey(0)

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/150710.html

標籤:Python

上一篇:LeetCode 25. K 個一組翻轉鏈表 | Python

下一篇:python(深淺拷貝)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more