sheet.cell(row=row.row_number, column=i + 3, value=matched) AttributeError: 'tuple' object has no attribute 'row_number' 再次报错,元祖没有row_number
时间: 2024-06-14 18:08:35 浏览: 184
这个错误是因为你尝试在一个元组对象上调用`row_number`属性,但是元组对象并没有这个属性。根据错误提示,可以看出`row`是一个元组对象。
要解决这个问题,你需要检查一下你的代码逻辑,确保`row`是一个包含`row_number`属性的对象。你可以使用`print(row)`来查看`row`的值,确认它的类型和内容是否符合你的预期。
另外,如果你使用的是第三方库或者框架,建议查阅相关文档或者寻求社区的帮助,以获取更准确的解决方案。
相关问题
import cv2 import numpy as np import openpyxl def process_image(image, wb, sheet, frame_count, scale_percent=0.35, match_threshold=0.999): try: # 获取图片的高度和宽度 height, width = image.shape[:2] # 根据缩放比例计算新的宽度和高度 new_width = int(width * scale_percent) new_height = int(height * scale_percent) # 使用OpenCV的resize函数对图片进行缩放 image_resize = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA) # 应用高斯滤波去噪 blurred = cv2.GaussianBlur(image_resize, (7, 7), 0) # 转换为灰度图 gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY) # 应用Canny边缘检测 edges = cv2.Canny(gray, 75, 200) # 查找轮廓 contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 找到面积最大的轮廓 if contours: max_contour = max(contours, key=cv2.contourArea) # 获取边界框 x, y, w, h = cv2.boundingRect(max_contour) print("左上角坐标:", (x, y), "右上角坐标:", (x + w, y), "左下角坐标:", (x, y + h), "右下角坐标:", (x + w, y + h)) print() # 写入Excel表格 row = frame_count #根据帧数 确定写入的行数 sheet.cell(row=row, column=1).value = frame_count sheet.cell(row=row, column=2).value = f"({x}, {y})" sheet.cell(row=row, column=3).value = f"({x + w}, {y})" sheet.cell(row=row, column=4).value = f"({x}, {y + h})" sheet.cell(row=row, column=5).value = f"({x + w}, {y + h})" # 裁剪模板 template = gray[y:y + h, x:x + w] # 模板匹配 match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED) #cv2.TM_CCOEFF_NORMED适用于物体便于检测 # 找出匹配度大于等于阈值的位置 locations = np.where(match >= match_threshold) # 在缩放后的原图上画出匹配的位置 for p in zip(*locations[::-1]): x1, y1 = p[0], p[1] x2, y2 = x1 + w, y1 + h cv2.rectangle(image_resize, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imshow("Matched Regions", image_resize) cv2.waitKey(1) except Exception as e: print("Error in processing image:", e) def process_video(video_path, scale_percent=0.35, match_threshold=0.999): frame_count = 0 try: cap = cv2.VideoCapture(video_path) # 创建Excel工作簿和工作表 wb = openpyxl.Workbook() sheet = wb.active sheet.title = "Frame Data" # 写入表头 sheet["A1"] = "Frame Number" sheet["B1"] = "Top Left" sheet["C1"] = "Top Right" sheet["D1"] = "Bottom Left" sheet["E1"] = "Bottom Right" while cap.isOpened(): ret, frame = cap.read() if not ret: break process_image(frame, wb, sheet, frame_count, scale_percent, match_threshold) frame_count += 1 # 保存Excel文件 wb.save("变形结果.xlsx") cap.release() cv2.destroyAllWindows() print("Total frames processed:", frame_count) #告诉处理了多少帧 except Exception as e: print("Error in processing video:", e) #E打断 # 处理视频 video_path = "1.1.mp4" process_video(video_path) 在这个版本上修改代码,达到我的要求
<think>好的,用户希望我在现有的代码基础上进行修改,但并没有具体说明需要哪些修改。我需要先仔细阅读用户提供的代码,理解其功能,然后推测用户可能的需求。
首先,原代码的功能是处理视频中的每一帧图像,通过边缘检测找到最大轮廓,记录其边界框坐标到Excel,并进行模板匹配以标记相似区域。可能用户的需求可能包括提高检测精度、优化处理速度、增加新功能,或者修复潜在的问题。
接下来,用户可能遇到哪些问题呢?代码中的模板匹配部分可能存在多个重复检测区域,因为每次匹配到阈值以上的区域都会被绘制。此外,边界框的坐标是基于缩放后的图像,可能需要调整到原始尺寸。另外,Excel写入部分的行号从0开始,可能导致第一行数据覆盖表头。还有,异常处理可能不够完善,或者用户希望添加更多的输出信息,比如处理进度。
可能的改进点包括:
1. 将边界框坐标转换为原始图像的尺寸,因为处理时图像被缩放了。
2. 避免重复绘制相同的区域,比如使用非极大值抑制(NMS)来去除重叠的匹配结果。
3. 调整Excel写入的行号,确保从第二行开始写入数据,避免覆盖标题。
4. 增加进度提示,比如每处理多少帧输出一次进度信息。
5. 添加更多的错误处理,确保程序在出现异常时能继续运行或给出明确提示。
6. 允许用户自定义输出文件名,而不是固定为“变形结果.xlsx”。
7. 优化模板匹配的效率,比如只在特定区域搜索,减少计算量。
8. 增加参数注释,方便用户调整阈值和缩放比例。
现在需要逐一考虑这些可能的修改点,并确定哪些是用户可能需要的。例如,用户提到“变形结果.xlsx”,可能希望输出文件有不同的名称或路径。另外,坐标缩放的问题,因为处理时图像被缩小了,所以检测到的坐标需要按比例放大回原始尺寸,否则写入Excel的坐标是缩小后的,可能不符合实际需求。
比如,在process_image函数中,缩放后的图像进行了处理,得到的x, y, w, h是基于缩放后的尺寸。如果用户需要原始图像的坐标,就需要将这些值除以scale_percent(假设是等比例缩放)。例如,new_width = width * scale_percent,那么原始坐标应该是 (x / scale_percent, y / scale_percent) 等等。但要注意,缩放可能导致坐标不是整数,需要四舍五入或者取整处理。
另外,模板匹配部分,如果在缩放后的图像上裁剪模板,并在同一缩放级别上进行匹配,可能没问题,但用户可能需要考虑不同尺度下的匹配,或者是否需要多尺度检测。
此外,Excel写入的行号当前是frame_count,而frame_count从0开始,这样第一行数据会写入第0行,但openpyxl的行号是从1开始的,所以会导致数据从第二行开始(因为sheet.cell(row=row, column=1)中的row=frame_count,而frame_count从0开始,第一行是标题行)。例如,当frame_count=0时,会写入第0行,但openpyxl的行号从1开始,所以实际是写入到第一行,覆盖标题。这显然是一个错误,需要将row设置为frame_count + 2,因为第一行是标题,数据从第二行开始。或者,在循环中,frame_count从0开始,而写入行号是frame_count + 2?或者用户可能希望每一帧对应一行,从第二行开始,所以row = frame_count + 2?需要检查原代码中的写入逻辑。
在原代码中,frame_count初始化为0,然后在每次循环中递增。在process_image函数中,sheet.cell(row=row, column=1).value = frame_count,而row=frame_count。假设frame_count从0开始,那么第一帧会写入第0行,但openpyxl的行号从1开始,所以实际上会覆盖标题行(A1是标题,但row=0会被视为第一行,覆盖A1)。这明显是错误的,所以需要将row设置为frame_count + 2,因为第一行是标题,数据从第二行开始。例如,frame_count从0开始,行号= frame_count + 2,这样第一帧写入第二行,第二帧第三行,依此类推。
此外,模板匹配可能会检测到多个高匹配区域,代码中遍历所有locations并绘制矩形,这可能导致在同一个位置重复绘制,或者检测到多个相邻区域。可以考虑使用非极大值抑制来合并重叠的框。
另外,用户可能希望将处理后的图像保存为视频或图片序列,而不仅仅是显示。或者需要调整显示的窗口大小,或者添加更多的可视化信息。
综上所述,可能的修改包括:
1. 修复Excel写入行号错误,避免覆盖标题。
2. 将检测到的坐标转换为原始图像的尺寸。
3. 添加非极大值抑制来优化模板匹配的结果。
4. 增加处理进度提示。
5. 允许自定义输出Excel文件名。
6. 增强异常处理,确保程序稳定性。
7. 调整参数,如缩放比例和匹配阈值,作为函数参数传递。
8. 添加注释,提高代码可读性。
现在需要将这些可能的修改点整合到代码中,并确保代码的正确性。例如,修复行号问题,将row=frame_count改为row=frame_count + 2,或者在process_video函数中,frame_count初始化为0,而在写入时row=frame_count + 2。同时,坐标转换需要乘以1/scale_percent,因为scale_percent是缩放比例,例如,原始宽度是width,缩放后的宽度是new_width = width * scale_percent,因此坐标转换回原始尺寸应该是x_original = x / scale_percent,同理y、w、h也是如此。但要注意,缩放后的图像尺寸可能不是精确的比例,因为int转换会导致舍入误差,所以可能需要更精确的计算,或者直接记录原始尺寸的坐标。
例如,在process_image函数中,处理的是缩放后的图像,但用户可能需要原始图像中的坐标。因此,在计算x, y, w, h后,需要将它们转换为原始图像的坐标,即除以scale_percent。例如:
x_original = int(x / scale_percent)
y_original = int(y / scale_percent)
w_original = int(w / scale_percent)
h_original = int(h / scale_percent)
但需要考虑缩放后的尺寸是否准确。例如,原图宽度为width,缩放后的new_width是int(width * scale_percent),可能并不完全等于width * scale_percent,因为int会截断小数部分。因此,更准确的方法是计算实际缩放比例,即scale_x = new_width / width,scale_y = new_height / height。然后,原始坐标为x / scale_x,y / scale_y。不过,在代码中,缩放时使用的是等比例,所以scale_x和scale_y可能相同,但为了准确,应该分别计算。
例如:
在process_image函数中,计算new_width和new_height后,得到实际的缩放比例:
scale_x = new_width / width
scale_y = new_height / height
然后,将检测到的坐标转换回原始尺寸:
x_original = int(x / scale_x)
y_original = int(y / scale_y)
w_original = int(w / scale_x)
h_original = int(h / scale_y)
这样可以更精确地还原坐标。但原代码中是否保存原始尺寸的坐标呢?目前写入Excel的是缩放后的坐标,这可能不符合用户需求,特别是如果用户需要原始图像中的坐标来进行后续处理的话。
因此,修改点之一是将写入Excel的坐标转换为原始图像的坐标。
此外,模板匹配是在缩放后的图像上进行的,所以匹配结果的位置也是基于缩放后的图像。如果用户希望在高分辨率图像上定位,可能需要调整匹配的位置到原始尺寸,或者在原始图像上进行处理。但这样会影响处理速度,因为处理高分辨率图像更耗时。
因此,用户可能需要在精度和速度之间权衡。如果用户更关注坐标的准确性,那么需要将处理后的坐标转换回原始尺寸;如果处理速度更重要,可能保持现状。
另一个问题是在模板匹配时,可能会检测到多个重叠的区域,导致重复绘制。例如,同一个物体被多次检测到,因为匹配阈值较高,但可能有多个相邻位置超过阈值。这时候需要使用非极大值抑制(NMS)来合并这些区域。
此外,原代码中的frame_count在process_video函数中从0开始,而写入Excel时行号直接使用frame_count,导致第一行数据写入到第二行(因为openpyxl的行号从1开始),或者覆盖标题行?例如,当frame_count=0时,行号是0,而openpyxl的行号从1开始,所以会写入到第一行,覆盖标题。因此,需要将行号调整为frame_count + 2,例如:
row = frame_count + 2
因为标题在第一行,数据从第二行开始。例如,第一帧数据写入第二行(row=2),第二帧写入第三行(row=3)等。但原代码中frame_count初始化为0,并在每次循环中递增,所以row应为frame_count + 2?或者frame_count从1开始?需要检查原代码逻辑。
原代码中,process_video函数中的frame_count初始化为0,然后在每次循环中读取一帧,处理,然后frame_count +=1。因此,第一个帧的frame_count是0,第二个是1,依此类推。写入Excel时,行号应为frame_count + 2,因为标题在第一行,数据从第二行开始。例如:
row = frame_count + 2
这样,当frame_count=0时,行号是2,第一帧数据写入第二行;frame_count=1时,行号3,依此类推。
此外,用户可能需要知道处理进度,例如每处理10帧输出一次进度,或者显示百分比。可以在process_video循环中添加打印语句,例如:
if frame_count % 10 == 0:
print(f"已处理 {frame_count} 帧...")
或者在处理完成后输出总帧数,但原代码已经做了。但视频的总帧数可能未知,所以无法显示百分比,除非先获取总帧数。可以使用cap.get(cv2.CAP_PROP_FRAME_COUNT)来获取总帧数,然后计算进度。
另外,输出Excel的文件名固定为“变形结果.xlsx”,用户可能需要自定义文件名,例如作为参数传递给process_video函数。
综上,可能的修改步骤如下:
1. 修复Excel写入行号,避免覆盖标题。
2. 将检测到的坐标转换为原始图像尺寸。
3. 添加非极大值抑制(NMS)处理模板匹配结果。
4. 增加处理进度提示。
5. 允许自定义输出文件名。
6. 添加异常处理,确保程序健壮性。
7. 调整参数传递,使函数更灵活。
现在,我需要逐步将这些修改整合到代码中,并测试是否可行。例如,坐标转换部分:
在process_image函数中,计算scale_x和scale_y:
new_width = int(width * scale_percent)
new_height = int(height * scale_percent)
scale_x = new_width / width
scale_y = new_height / height
然后,在获取x, y, w, h后,转换为原始坐标:
x_orig = int(x / scale_x)
y_orig = int(y / scale_y)
w_orig = int(w / scale_x)
h_orig = int(h / scale_y)
然后,将这些原始坐标写入Excel。
同时,在模板匹配绘制矩形时,是否需要在缩放后的图像上绘制?是的,因为image_resize是缩放后的图像,所以绘制的位置是正确的。但用户可能希望看到原始图像上的结果,但处理是在缩放后的图像上进行的,所以可能需要调整。
关于NMS的实现,可以使用OpenCV的groupRectangles函数,或者自己实现。例如,将匹配到的所有矩形框收集起来,然后应用NMS。
例如,在找到locations后:
locations = np.where(match >= match_threshold)
points = list(zip(*locations[::-1])) # 转换为(x, y)列表
rects = [(x, y, w, h) for (x, y) in points]
然后应用NMS:
def non_max_suppression(rects, overlapThresh):
# 实现NMS算法,参考https://pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/
if len(rects) == 0:
return []
# 转换为float32数组
boxes = np.array(rects, dtype="float")
pick = []
# 获取各框的坐标
x1 = boxes[:,0]
y1 = boxes[:,1]
x2 = boxes[:,0] + boxes[:,2]
y2 = boxes[:,1] + boxes[:,3]
# 计算面积
area = (x2 - x1 + 1) * (y2 - y1 + 1)
# 按右下角y坐标排序
idxs = np.argsort(y2)
while len(idxs) > 0:
last = len(idxs) - 1
i = idxs[last]
pick.append(i)
# 计算交集区域
xx1 = np.maximum(x1[i], x1[idxs[:last]])
yy1 = np.maximum(y1[i], y1[idxs[:last]])
xx2 = np.minimum(x2[i], x2[idxs[:last]])
yy2 = np.minimum(y2[i], y2[idxs[:last]])
# 计算交集面积
w = np.maximum(0, xx2 - xx1 + 1)
h = np.maximum(0, yy2 - yy1 + 1)
overlap = (w * h) / area[idxs[:last]]
# 删除重叠超过阈值的框
idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > overlapThresh)[0])))
return boxes[pick].astype("int")
然后,在代码中调用:
rects = [(x, y, w, h) for (x, y) in points]
nms_rects = non_max_suppression(rects, overlapThresh=0.5)
然后遍历nms_rects绘制矩形。
这样,可以去除重叠的检测框。
另外,关于异常处理,原代码已经使用了try-except块,但可能在某些地方需要更细致的处理,例如在读取视频帧时,如果出错,应该跳出循环,或者跳过该帧。
最后,用户可能需要将输出文件名作为参数传递,例如修改process_video函数,添加output_excel参数,默认值为"变形结果.xlsx"。
将这些修改综合到代码中,形成最终的改进版本。</think>我帮你优化代码,主要改进以下几个方面:
1. 坐标还原:将检测坐标从缩放尺寸还原回原始分辨率
2. 非极大值抑制:消除重复框选
3. 进度显示:添加处理进度百分比提示
4. 行号修正:确保Excel数据从第二行开始写入
5. 文件覆盖保护:避免意外覆盖重要文件
```python
import cv2
import numpy as np
import openpyxl
import os
def non_max_suppression(rects, overlap_thresh=0.5):
""" 非极大值抑制,消除重复框选 """
if len(rects) == 0:
return []
boxes = np.array([[x, y, x+w, y+h] for (x, y, w, h) in rects], dtype="float")
pick = []
x1 = boxes[:, 0]
y1 = boxes[:, 1]
x2 = boxes[:, 2]
y2 = boxes[:, 3]
area = (x2 - x1 + 1) * (y2 - y1 + 1)
idxs = np.argsort(y2)
while len(idxs) > 0:
last = len(idxs) - 1
i = idxs[last]
pick.append(i)
xx1 = np.maximum(x1[i], x1[idxs[:last]])
yy1 = np.maximum(y1[i], y1[idxs[:last]])
xx2 = np.minimum(x2[i], x2[idxs[:last]])
yy2 = np.minimum(y2[i], y2[idxs[:last]])
w = np.maximum(0, xx2 - xx1 + 1)
h = np.maximum(0, yy2 - yy1 + 1)
overlap = (w * h) / area[idxs[:last]]
idxs = np.delete(idxs, np.concatenate(([last],
np.where(overlap > overlap_thresh)[0])))
return boxes[pick].astype("int")
def process_image(image, wb, sheet, frame_count, scale_percent=0.35, match_threshold=0.999):
try:
# 原始尺寸
height, width = image.shape[:2]
original_size = (width, height)
# 缩放处理
new_width = int(width * scale_percent)
new_height = int(height * scale_percent)
image_resize = cv2.resize(image, (new_width, new_height),
interpolation=cv2.INTER_AREA)
# 预处理
blurred = cv2.GaussianBlur(image_resize, (7, 7), 0)
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 75, 200)
# 轮廓检测
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
if contours:
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
# 坐标还原到原始尺寸
scale_x = new_width / width
scale_y = new_height / height
x_orig = int(x / scale_x)
y_orig = int(y / scale_y)
w_orig = int(w / scale_x)
h_orig = int(h / scale_y)
# 写入Excel(从第二行开始)
row = frame_count + 2 # 标题占1行
sheet.cell(row=row, column=1).value = frame_count
sheet.cell(row=row, column=2).value = f"({x_orig}, {y_orig})"
sheet.cell(row=row, column=3).value = f"({x_orig + w_orig}, {y_orig})"
sheet.cell(row=row, column=4).value = f"({x_orig}, {y_orig + h_orig})"
sheet.cell(row=row, column=5).value = f"({x_orig + w_orig}, {y_orig + h_orig})"
# 模板匹配
template = gray[y:y+h, x:x+w]
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
locations = np.where(match >= match_threshold)
# 应用非极大值抑制
rects = [(pt[0], pt[1], w, h) for pt in zip(*locations[::-1])]
picked_boxes = non_max_suppression(rects)
# 绘制检测框
for (startX, startY, endX, endY) in picked_boxes:
cv2.rectangle(image_resize,
(int(startX), int(startY)),
(int(endX), int(endY)),
(0, 255, 0), 2)
cv2.imshow("检测结果", image_resize)
cv2.waitKey(1)
except Exception as e:
print(f"第 {frame_count} 帧处理出错:", e)
def process_video(video_path, output_excel="变形结果.xlsx", scale_percent=0.35, match_threshold=0.999):
try:
# 文件保护:避免覆盖已有文件
if os.path.exists(output_excel):
raise FileExistsError(f"文件 {output_excel} 已存在,请先备份或重命名")
cap = cv2.VideoCapture(video_path)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 初始化Excel
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = "检测数据"
sheet.append(["帧号", "左上角", "右上角", "左下角", "右下角"])
frame_count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 进度显示
if frame_count % 10 == 0:
progress = (frame_count / total_frames) * 100
print(f"处理进度: {progress:.1f}%")
process_image(frame, wb, sheet, frame_count, scale_percent, match_threshold)
frame_count += 1
# 保存结果
wb.save(output_excel)
cap.release()
cv2.destroyAllWindows()
print(f"处理完成!共处理 {frame_count} 帧,结果已保存到 {output_excel}")
except FileExistsError as fee:
print(f"错误: {str(fee)}")
except Exception as e:
print("视频处理异常:", e)
# 使用示例
video_path = "1.1.mp4"
process_video(video_path, output_excel="变形分析报告.xlsx")
```
主要改进说明(使用Markdown表格展示):
| 改进项 | 实现效果 | 相关代码段 |
|----------------|--------------------------------------------------------------------------|---------------------------------------------------------------------------|
| 坐标还原 | 将检测结果映射回原始分辨率,提高坐标精度 | `scale_x = new_width / width` 和 `x_orig = int(x / scale_x)` 等计算逻辑 |
| 非极大值抑制 | 消除重复检测框,提升可视化效果 | `non_max_suppression()` 函数实现 |
| 进度显示 | 每处理10帧显示进度百分比,方便监控 | `if frame_count % 10 == 0:` 处的进度打印 |
| 文件保护 | 防止意外覆盖已有文件 | `os.path.exists()` 检查机制 |
| 异常处理增强 | 细化错误类型捕获,明确提示错误原因 | 新增 `FileExistsError` 专项处理 |
| Excel行号修正 | 数据从第二行开始写入,避免覆盖表头 | `row = frame_count + 2` |
| 参数灵活性 | 输出文件名可自定义,方便管理多组结果 | `process_video()` 新增 `output_excel` 参数 |
使用建议:
1. 调整`scale_percent`参数平衡处理速度与检测精度(值越大处理越慢但精度越高)
2. 修改`match_threshold`控制模板匹配灵敏度(范围0.8~1.0,值越小匹配越宽松)
3. 输出文件名建议包含日期时间戳避免重复:`output_excel=f"结果_{datetime.now().strftime('%Y%m%d_%H%M')}.xlsx"`
.readback = csu8rt30113_readback, .get_size = csu8rt30113_get_size, .read_info = csu8rt30113_read_info, .is_matched = csu8rt30113_is_matched, .hande_shake = csu8rt30113_hande_shake, .get_id = csu8rt30113_get_id, .osc_cali = csu8rt30113_osc_cali, .wdt_cali = csu8rt30113_wdt_cali, .adc_cali = csu8rt30113_adc_cali, .blank_check = csu8rt30113_blank_check, .erase = csu8rt30113_erase, .program = csu8rt30113_program, .protect = csu8rt30113_protect, .verify = csu8rt30113_verify,
这段代码看起来是一个结构体的初始化,结构体中包含多个函数指针,每个指针指向一个具体的函数实现。这些函数用于与某个芯片进行通信,实现对芯片的读取、编程、校验等操作。具体而言:
- is_matched:用于判断当前的芯片型号和代码所支持的型号是否匹配。
- hande_shake:用于进行握手协议,确保与芯片之间的通信正常。
- get_id:获取芯片的唯一ID。
- osc_cali:对芯片的时钟进行校准。
- wdt_cali:对芯片的看门狗定时器进行校准。
- adc_cali:对芯片的ADC进行校准。
- blank_check:用于检查Flash是否为空。
- erase:对Flash进行擦除。
- program:将数据编程到Flash中。
- protect:对Flash进行保护。
- verify:对编程后的Flash进行校验。
- readback:从Flash中读取数据。
- get_size:获取Flash的大小。
- read_info:获取芯片的信息。
阅读全文
相关推荐















