a-table固定行数

时间: 2025-02-22 16:00:57 浏览: 62
### 设置 Ant Design Table 的固定行数 在 `a-table` 组件中,直接设置固定行数并不是通过特定属性实现的。相反,可以通过控制数据源 (`dataSource`) 和分页 (`pagination`) 来间接达到这一效果。 为了确保表格始终展示指定数量的行,可以调整 `dataSource` 只包含所需数量的数据项,并启用分页功能来限制每页显示的最大记录数[^1]: ```jsx import React from 'react'; import { Table } from 'antd'; const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', }, // 更多列定义... ]; // 假设要固定显示5行 const fixedRowCount = 5; // 构造一个长度为fixedRowCount的数据源 const dataSource = Array.from({ length: fixedRowCount }, (_, index) => ({ key: index, name: `Item ${index + 1}`, })); const App = () => ( <Table columns={columns} dataSource={dataSource} pagination={{ pageSize: fixedRowCount, // 每页只显示固定的行数 hideOnSinglePage: true, // 如果只有一页则隐藏分页器 }} /> ); export default App; ``` 上述代码展示了如何创建一个具有固定行数的表格实例。这里的关键在于将 `pageSize` 设定为目标行数并应用到分页配置中,从而保证每次仅加载设定好的行数[^2]。 对于需要动态改变固定行数的情况,可以根据实际需求修改 `fixedRowCount` 的值以及相应更新 `dataSource` 和 `pagination.pageSize` 参数即可满足不同场景下的使用要求。
阅读全文

相关推荐

<template> 厂别: {{ factoryData.fact }} <el-table :data="generateTableData(factoryData)" border style="width: 100%; margin-bottom: 20px" :header-cell-style="{ background: '#f5f7fa' }" > <el-table-column prop="factory" label="Factory" width="120" fixed /> <el-table-column prop="category" label="Category" width="120" fixed /> <el-table-column prop="model" label="Model" width="180" fixed /> <el-table-column v-for="season in factoryData.seasonList" :key="season" :prop="season" :label="season" width="100" > <template #default="{ row }"> {{ row[season] || 0 }} </template> </el-table-column> </el-table> </template> <script setup> import { ref } from "vue"; import { categoryBySeasonList } from "@/api/planning/page"; const pageList = ref([]); const loading = ref(true); // 生成表格数据的方法(已更新) const generateTableData = (factoryData) => { const tableData = []; factoryData.categoryList.forEach((category) => { const models = factoryData.plngProdGrpDescList .filter((item) => { if (category == "0") { return ( item.order_major_category == "0" || item.order_major_category == "" || !item.order_major_category ); } return item.order_major_category == category; }) .map((item) => item.plng_prod_grp_desc); const uniqueModels = [...new Set(models)]; uniqueModels.forEach((model) => { const rowData = { factory: factoryData.fact, category: category, model: model, }; factoryData.seasonList.forEach((season) => { const matchedPop = factoryData.popList.find((pop) => { const popSeason = pop.season ? pop.season.trim() : ""; const currentSeason = season ? season.trim() : ""; return ( popSeason == currentSeason && pop.plngProdGrpDesc == model && (pop.orderMajorCategory == category || (category == "0" && (!pop.orderMajorCategory || pop.orderMajorCategory == ""))) ); }); rowData[season] = matchedPop ? matchedPop.totalCount : 0; }); tableData.push(rowData); }); }); return tableData; }; /** 查询【请填写功能名称】列表 */ function getList() { loading.value = true; categoryBySeasonList().then((response) => { pageList.value = response.data; loading.value = false; }); } const props = defineProps({ autoLoad: { type: Boolean, default: true, }, }); const loadData = () => { getList(); }; defineExpose({ loadData, }); </script> <style scoped> .factory-tables { padding: 20px; } .factory-table-container { margin-bottom: 40px; } h2 { margin-bottom: 15px; color: #333; font-size: 18px; font-weight: bold; } .el-table { box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); } .el-table--border { border: 1px solid #ebeef5; } .el-table__fixed-right { box-shadow: -2px 0 8px rgba(0, 0, 0, 0.08); } </style> 经过修缮以上代码是完全正确的,现在需要添加一点需求,就是对表格列进行合并,比如第一列factory,因为三个厂都有各自的表格,所以每个表格的factory列值都一样,所以就可以合并factory列为一行就可以了,然后第二列Category也可以进行合并,值相同的就合为一行,其他列保持不变

#include "images.h" uint8 l_border[MT9V03X_H];//左线数组 uint8 r_border[MT9V03X_H];//右线数组 uint8 center_line[MT9V03X_H];//中线数组 /*变量声明*/ //uint8 original_image[MT9V03X_H][MT9V03X_W]; uint8 bin_image[MT9V03X_H][MT9V03X_W];//图像数组 uint8 image_thereshold_last = 0;// uint8 image_thereshold;//图像分割阈值 //------------------------------------------------------------------------------------------------------------------ // @函数功能 求绝对值 // @函数返回 绝对值 //------------------------------------------------------------------------------------------------------------------ int my_abs(int value) { if(value>=0) return value; else return -value; } //数值范围限制 int16 limit_a_b(int16 x, int a, int b) { if(x<a) x = a; if(x>b) x = b; return x; } //------------------------------------------------------------------------------------------------------------------ // @函数功能 求x,y中的最小值 // @函数返回 两值中的最小值 //------------------------------------------------------------------------------------------------------------------ int16 limit1(int16 x, int16 y) { if (x > y) return y; else if (x < -y) return -y; else return x; } //------------------------------------------------------------------------------------------------------------------ // @函数功能 获得一副灰度图像 // @函数返回 灰度图像数组original_image //------------------------------------------------------------------------------------------------------------------ void Get_image(uint8(*mt9v03x_image)[MT9V03X_W]) { uint8 i = 0, j = 0; for (i = 0; i < MT9V03X_H; i += 1) { for (j = 0; j <MT9V03X_W; j += 1) { bin_image[i][j] = mt9v03x_image[i][j]; } } } //将原始图像复制到bin_image数组 //------------------------------------------------------------------------------------------------------------------ // @函数功能 大津法求动态阈值 // @函数返回 动态阈值Threshold //------------------------------------------------------------------------------------------------------------------ uint8 OtsuThreshold(uint8 *image) { uint8 Pixel_Max = 0; uint8 Pixel_Min = 255; //uint16 width = MT9V03X_W / use_num; //uint16 height = MT9V03X_H / use_num; int pixelCount[GrayScale]; //各像素GrayScale的个数pixelCount 一维数组 float pixelPro[GrayScale]; //各像素GrayScale所占百分比pixelPro 一维数组 int16 i = 0; int16 j = 0; int16 pixelSum = MT9V03X_W * MT9V03X_H / 4; //pixelSum是获取总的图像像素个数的1/4,相应下面轮询时高和宽都是以2为单位自增 uint8 threshold = 0; uint8* data = image; //指向像素数据的指针 for(i = 0;i < GrayScale;i++) { pixelCount[i] = 0; pixelPro[i] = 0; } uint32 gray_sum = 0; //统计灰度图中每个像素在整幅图像中的个数 for(i = 0;i < MT9V03X_H;i += 2) { for(j = 0;j < MT9V03X_W; j += 2) { pixelCount[(int)data[i * MT9V03X_W + j]]++; //将当前的点的像素值作为计数数组的下标 gray_sum += (int)data[i * MT9V03X_W + j]; //灰度值总和 if(data[i * MT9V03X_W + j] > Pixel_Max) { Pixel_Max = data[i * MT9V03X_W + j]; } if(data[i * MT9V03X_W + j] < Pixel_Min) { Pixel_Min = data[i * MT9V03X_W + j]; } } } //计算每个像素值的点在整幅图像中的比例 for(i = Pixel_Min;i < Pixel_Max;i++) { pixelPro[i] = (float)pixelCount[i] / pixelSum; } //遍历灰度值 float w0,w1,u0tmp,u1tmp,u0,u1,deltaTmp,deltaMax = 0; w0 = w1 = u0tmp = u1tmp = u0 = u1 = deltaTmp = 0; for(j = Pixel_Min;j < Pixel_Max;j++) { w0 += pixelPro[j]; //背景部分每个灰度值的像素点所占比例之和 即背景部分的比例 u0tmp += j * pixelPro[j]; //背景部分 每个灰度值的点的比例 *灰度值 w1 = 1 - w0; u1tmp = gray_sum / pixelSum-u0tmp; u0 = u0tmp / w0; //背景平均灰度 u1 = u1tmp / w1; //前景平均灰度 deltaTmp = (float)(w0 * w1 * (u0 - u1) * (u0 - u1)); if(deltaTmp > deltaMax) { deltaMax = deltaTmp; threshold = (uint8)j; } if(deltaTmp < deltaMax) { break; } } //限幅 if(threshold > 25 && threshold < 235) { image_thereshold_last = threshold; } else { threshold = image_thereshold_last; } return threshold; } //------------------------------------------------------------------------------------------------------------------ // @函数功能 图像二值化,大津法 // @函数返回 二值化图像数组bin_image //------------------------------------------------------------------------------------------------------------------ void turn_to_bin(void) { uint8 i,j; image_thereshold = OtsuThreshold(bin_image[0]); //ips114_show_int(189,0,image_thereshold,5); for(i = 0;i < MT9V03X_H;i++) { for(j = 0;j < MT9V03X_W;j++) { if(bin_image[i][j] > image_thereshold) { bin_image[i][j] = 255; } else { bin_image[i][j] = 0; } } } /* for(i = 40;i < MT9V03X_H;i++) { for(j = 0;j < MT9V03X_W;j++) { if(bin_image[i][j] < image_thereshold) { bin_image[i][j] = 0; } else { bin_image[i][j] =255; } } }*/ } //------------------------------------------------------------------------------------------------------------------ // @函数功能 寻找两个边界的边界点作为八邻域循环的起始点 // @参数说明 输入任意行数 // @函数返回 无 //------------------------------------------------------------------------------------------------------------------ uint8 start_point_l[2] = { 0 };//左边起点的x,y值 uint8 start_point_r[2] = { 0 };//右边起点的x,y值 uint8 get_start_point(uint8 start_row) { uint8 i = 0,j = MT9V03X_W/2,l_found = 0,r_found = 0,num = 0; //清零 start_point_l[0] = 0;//左x start_point_l[1] = 0;//左y start_point_r[0] = 0;//右x start_point_r[1] = 0;//右y //大致定位白线 for(num = 0;num < MT9V03X_W/2 - 15;num = num + 10) { if(bin_image[start_row][j + num] == 255) { j = j + num; break; } if(bin_image[start_row][j - num] == 255) { j = j - num; break; } } //从中间往左边,先找起点 for (i = j; i > border_min; i--) { start_point_l[0] = i;//x start_point_l[1] = start_row;//y if (bin_image[start_row][i] == 255 && bin_image[start_row][i - 1] == 0) { //printf("找到左边起点image[%d][%d]\n", start_row,i); l_found = 1; break; } } for (i = j; i < border_max; i++) { start_point_r[0] = i;//x start_point_r[1] = start_row;//y if (bin_image[start_row][i] == 255 && bin_image[start_row][i + 1] == 0) { //printf("找到右边起点image[%d][%d]\n",start_row, i); r_found = 1; break; } } if(l_found&&r_found) { return 1; } else { //printf("未找到起点\n"); return 0; } } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // @函数功能 八邻域正式开始找右边点的函数,左右线一次性找完。 Tip:特别注意,不要拿宏定义名字作为输入参数,否则数据可能无法传递过来 // @参数说明 // break_flag_r 最多需要循环的次数 // (*image)[image_w] 需要进行找点的图像数组,必须是二值图,填入数组名称即可 // *l_stastic 统计左边数据,用来输入初始数组成员的序号和取出循环次数 // *r_stastic 统计右边数据,用来输入初始数组成员的序号和取出循环次数 // l_start_x 左边起点横坐标 // l_start_y 左边起点纵坐标 // r_start_x 右边起点横坐标 // r_start_y 右边起点纵坐标 // hightest 循环结束所得到的最高高度 // @函数返回 无 // @备 注: //example:search_l_r((uint16)USE_num,image,&data_stastics_l, &data_stastics_r,start_point_l[0],start_point_l[1], start_point_r[0], start_point_r[1],&hightest); //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #define USE_num MT9V03X_H*3 //定义找点的数组成员个数按理说300个点能放下,但是有些特殊情况确实难顶,多定义了一点 //存放点的x,y坐标 uint16 points_l[(uint16)USE_num][2] = { { 0 } };//左线 uint16 points_r[(uint16)USE_num][2] = { { 0 } };//右线 uint16 dir_r[(uint16)USE_num] = { 0 };//用来存储右边生长方向 uint16 dir_l[(uint16)USE_num] = { 0 };//用来存储左边生长方向 uint16 data_stastics_l = 0;//统计左边找到点的个数 uint16 data_stastics_r = 0;//统计右边找到点的个数 uint8 hightest = 0;//最高点 void search_l_r(uint16 break_flag, uint8(*image)[MT9V03X_W], uint16 *l_stastic, uint16 *r_stastic, uint8 l_start_x, uint8 l_start_y, uint8 r_start_x, uint8 r_start_y, uint8*hightest) { uint8 i = 0, j = 0; //左边变量 uint8 search_filds_l[8][2] = { { 0 } }; uint8 index_l = 0; uint8 temp_l[8][2] = { { 0 } }; uint8 center_point_l[2] = { 0 }; uint16 l_data_statics;//统计左边 //定义八个邻域 static int8 seeds_l[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},}; //{-1,-1} {0,-1} {+1,-1} //{-1, 0} {+1, 0} //{-1,+1} {0,+1} {+1,+1} //顺时针 //右边变量 uint8 search_filds_r[8][2] = { { 0 } }; uint8 center_point_r[2] = { 0 };//中心坐标点 uint8 index_r = 0;//索引下标 uint8 temp_r[8][2] = { { 0 } }; uint16 r_data_statics;//统计右边 //定义八个邻域 static int8 seeds_r[8][2] = { {0,1},{1,1},{1,0}, {1,-1},{0,-1},{-1,-1}, {-1,0},{-1,1}, }; //{-1,-1} {0,-1} {+1,-1}, //{-1, 0} {+1, 0} //{-1,+1} {0,+1} {+1,+1} //这个是逆时针 l_data_statics = *l_stastic;//统计找到了多少个点,方便后续把点全部画出来 r_data_statics = *r_stastic;//统计找到了多少个点,方便后续把点全部画出来 //第一次更新坐标点 将找到的起点值传进来 center_point_l[0] = l_start_x;//x center_point_l[1] = l_start_y;//y center_point_r[0] = r_start_x;//x center_point_r[1] = r_start_y;//y //开启邻域循环 while (break_flag--) { //左边 for (i = 0; i < 8; i++)//传递8F坐标 { search_filds_l[i][0] = center_point_l[0] + seeds_l[i][0];//x search_filds_l[i][1] = center_point_l[1] + seeds_l[i][1];//y } //中心坐标点填充到已经找到的点内 points_l[l_data_statics][0] = center_point_l[0];//x points_l[l_data_statics][1] = center_point_l[1];//y l_data_statics++;//索引加一 //右边 for (i = 0; i < 8; i++)//传递8F坐标 { search_filds_r[i][0] = center_point_r[0] + seeds_r[i][0];//x search_filds_r[i][1] = center_point_r[1] + seeds_r[i][1];//y } //中心坐标点填充到已经找到的点内 points_r[r_data_statics][0] = center_point_r[0];//x points_r[r_data_statics][1] = center_point_r[1];//y index_l = 0;//先清零,后使用 for (i = 0; i < 8; i++) { temp_l[i][0] = 0;//先清零,后使用 temp_l[i][1] = 0;//先清零,后使用 } //左边判断 for (i = 0; i < 8; i++) { if (image[search_filds_l[i][1]][search_filds_l[i][0]] == 0 && image[search_filds_l[(i + 1) & 7][1]][search_filds_l[(i + 1) & 7][0]] == 255) { temp_l[index_l][0] = search_filds_l[(i)][0]; temp_l[index_l][1] = search_filds_l[(i)][1]; index_l++; dir_l[l_data_statics - 1] = (i);//记录生长方向 } if (index_l) { //更新坐标点 center_point_l[0] = temp_l[0][0];//x center_point_l[1] = temp_l[0][1];//y for (j = 0; j < index_l; j++) { if (center_point_l[1] > temp_l[j][1]) { center_point_l[0] = temp_l[j][0];//x center_point_l[1] = temp_l[j][1];//y } } } } if ((points_r[r_data_statics][0]== points_r[r_data_statics-1][0]&& points_r[r_data_statics][0] == points_r[r_data_statics - 2][0] && points_r[r_data_statics][1] == points_r[r_data_statics - 1][1] && points_r[r_data_statics][1] == points_r[r_data_statics - 2][1]) ||(points_l[l_data_statics-1][0] == points_l[l_data_statics - 2][0] && points_l[l_data_statics-1][0] == points_l[l_data_statics - 3][0] && points_l[l_data_statics-1][1] == points_l[l_data_statics - 2][1] && points_l[l_data_statics-1][1] == points_l[l_data_statics - 3][1])) { //printf("三次进入同一个点,退出\n"); break; } if (my_abs(points_r[r_data_statics][0] - points_l[l_data_statics - 1][0]) < 2 && my_abs(points_r[r_data_statics][1] - points_l[l_data_statics - 1][1] < 2)) { //printf("\n左右相遇退出\n"); *hightest = (points_r[r_data_statics][1] + points_l[l_data_statics - 1][1]) >> 1;//取出最高点 //printf("\n在y=%d处退出\n",*hightest); break; } if ((points_r[r_data_statics][1] < points_l[l_data_statics - 1][1])) { //printf("\n如果左边比右边高了,左边等待右边\n"); continue;//如果左边比右边高了,左边等待右边 } if (dir_l[l_data_statics - 1] == 7 && (points_r[r_data_statics][1] > points_l[l_data_statics - 1][1]))//左边比右边高且已经向下生长了 { //printf("\n左边开始向下了,等待右边,等待中... \n"); center_point_l[0] = points_l[l_data_statics - 1][0];//x center_point_l[1] = points_l[l_data_statics - 1][1];//y l_data_statics--; } r_data_statics++;//索引加一 index_r = 0;//先清零,后使用 for (i = 0; i < 8; i++) { temp_r[i][0] = 0;//先清零,后使用 temp_r[i][1] = 0;//先清零,后使用 } //右边判断 for (i = 0; i < 8; i++) { if (image[search_filds_r[i][1]][search_filds_r[i][0]] == 0 && image[search_filds_r[(i + 1) & 7][1]][search_filds_r[(i + 1) & 7][0]] == 255) { temp_r[index_r][0] = search_filds_r[(i)][0]; temp_r[index_r][1] = search_filds_r[(i)][1]; index_r++;//索引加一 dir_r[r_data_statics - 1] = (i);//记录生长方向 //printf("dir[%d]:%d\n", r_data_statics - 1, dir_r[r_data_statics - 1]); } if (index_r) { //更新坐标点 center_point_r[0] = temp_r[0][0];//x center_point_r[1] = temp_r[0][1];//y for (j = 0; j < index_r; j++) { if (center_point_r[1] > temp_r[j][1]) { center_point_r[0] = temp_r[j][0];//x center_point_r[1] = temp_r[j][1];//y } } } } } //取出循环次数 *l_stastic = l_data_statics; *r_stastic = r_data_statics; } //------------------------------------------------------------------------------------------------------------------ // @函数功能 从八邻域边界里提取需要的左边线 // @参数说明 total_L :找到的点的总数 // @函数返回 左边线数组l_border //------------------------------------------------------------------------------------------------------------------ uint16 border_to_edge_l[MT9V03X_H];//存放左边border和edge的映射关系的数组 void get_left(uint16 total_L) { uint8 i = 0; uint16 j = 0; uint8 h = 0; //初始化 for (i = 0;i<MT9V03X_H;i++) { l_border[i] = border_min; } h = MT9V03X_H - 2; //左边 for (j = 0; j < total_L; j++) { //printf("%d\n", j); if (points_l[j][1] == h) { l_border[h] = points_l[j][0]+1; border_to_edge_l[h] = j; } else continue; //每行只取一个点,没到下一行就不记录 h--; if (h == 0) { break;//到最后一行退出 } } } //------------------------------------------------------------------------------------------------------------------ // @函数功能 从八邻域边界里提取需要的右边线 // @参数说明 total_R :找到的点的总数 // @函数返回 右边线数组r_border //------------------------------------------------------------------------------------------------------------------ uint16 border_to_edge_r[MT9V03X_H];//存放右边border和edge的映射关系的数组 void get_right(uint16 total_R) { uint8 i = 0; uint16 j = 0; uint8 h = 0; for (i = 0; i < MT9V03X_H; i++) { r_border[i] = border_max;//右边线初始化放到最右边,左边线放到最左边,这样八邻域闭合区域外的中线就会在中间,不会干扰得到的数据 } h = MT9V03X_H - 2; //右边 for (j = 0; j < total_R; j++) { if (points_r[j][1] == h) { r_border[h] = points_r[j][0] - 1; border_to_edge_r[h] = j; } else continue;//每行只取一个点,没到下一行就不记录 h--; if (h == 0)break;//到最后一行退出 } } //------------------------------------------------------------------------------------------------------------------ // @函数功能 滤波减少噪声 // @函数返回 经过滤波的图像数组bin_image //------------------------------------------------------------------------------------------------------------------ #define threshold_max 255*5//定义膨胀的阈值区间 #define threshold_min 255*2//定义腐蚀的阈值区间 void image_filter(uint8(*bin_image)[MT9V03X_W])//形态学滤波,膨胀和腐蚀 { uint16 i, j; uint32 num = 0; for (i = 1; i < MT9V03X_H - 1; i++) { for (j = 1; j < (MT9V03X_W - 1); j++) { //统计八个方向的像素值 num = bin_image[i - 1][j - 1] + bin_image[i - 1][j] + bin_image[i - 1][j + 1] + bin_image[i][j - 1] + bin_image[i][j + 1] + bin_image[i + 1][j - 1] + bin_image[i + 1][j] + bin_image[i + 1][j + 1]; if (num >= threshold_max && bin_image[i][j] == 0) { bin_image[i][j] = 255;//白 } if (num <= threshold_min && bin_image[i][j] == 255) { bin_image[i][j] = 0;//黑 } } } } //------------------------------------------------------------------------------------------------------------------ // @函数功能 给图像画一个黑框 // @函数返回 带有黑框的图像数组bin_image //------------------------------------------------------------------------------------------------------------------ void image_draw_rectan(uint8(*image)[MT9V03X_W]) { uint8 i = 0; for (i = 0; i < MT9V03X_H; i++) { image[i][0] = 0; image[i][1] = 0; image[i][MT9V03X_W - 1] = 0; image[i][MT9V03X_W - 2] = 0; } for (i = 0; i < MT9V03X_W; i++) { image[0][i] = 0; image[1][i] = 0; //image[image_h-1][i] = 0; } } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // @函数功能 环岛元素识别处理 // @函数返回 无 //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //全局状态变量 IslandState current_state = NORMAL; uint8_t island_type = 0; // 0:未确定 1:左环岛 2:右环岛 uint8 target_h = 0;//存放断裂点行数 uint16 A_edge = 0; uint16 V_edge = 0; uint8 A_point = 0; uint8 P_point = 0; uint8 V_point = 0; //------------------------------------------------------------------------------------------------------------------ // @函数功能 边界连续性判断 // @参数说明 需要寻找的边线 // @函数返回 有断裂返回0,无断裂返回1 //------------------------------------------------------------------------------------------------------------------ uint8 border_continuous(uint8 *border) { for(uint8 i = MT9V03X_H-1;i > 0;i--) { int8 diff = border[i] - border[i - 1]; if(diff < -4 || diff > 4) { target_h = i; return 0;//有断裂 } } return 1;//无断裂 } //------------------------------------------------------------------------------------------------------------------ // @函数功能 寻找A点 // @函数返回 A点 //------------------------------------------------------------------------------------------------------------------ //左圆环时寻找左边界A点 uint8 find_point_A_l(void) { uint16 j = border_to_edge_l[target_h];//映射 int16 search_min = j - search_range;//遍历点的最小编号 int16 search_max = j + search_range;//遍历点的最大编号 //限定查找区间 if(search_min < 3) { search_min = 3; } if(search_max > data_stastics_l - 2) { search_max = data_stastics_l - 2; } //遍历寻找A点 for(j = search_min;j <= search_max;j++) { if(points_l[j+2][0] data_stastics_r - 2) { search_max = data_stastics_r - 2; } //遍历寻找A点 for(j = search_min;j <= search_max;j++) { if(points_l[j+2][0]>points_l[j][0] && points_l[j+2][1] 1;i++) { if(l_border[i-2] < l_border[i] && l_border[i+2] < l_border[i]) { P_point = i; return 1;//找到P点 } } return 0;//未找到P点 } //右圆环时寻找左边界P点 uint8 find_point_P_r(void) { for(uint8 i = MT9V03X_H - 2;i > 1;i++) { if(l_border[i-2] > l_border[i] && l_border[i+2] > l_border[i]) { P_point = i; return 1;//找到P点 } } return 0;//未找到P点 } //------------------------------------------------------------------------------------------------------------------ // @函数功能 寻找V点 // @函数返回 V点 //------------------------------------------------------------------------------------------------------------------ //左边V点 uint8 find_point_V_l(void) { uint16 j = border_to_edge_l[target_h];//映射 int16 search_min = j - search_range;//遍历点的最小编号 int16 search_max = j + search_range;//遍历点的最大编号 //限定查找区间 if(search_min < 3) { search_min = 3; } if(search_max > data_stastics_l - 2) { search_max = data_stastics_l - 2; } //遍历寻找V点 for(j = search_min;j <= search_max;j++) { if(points_l[j+2][1] data_stastics_r - 2) { search_max = data_stastics_r - 2; } //遍历寻找V点 for(j = search_min;j <= search_max;j++) { if(points_l[j+2][1] end_point;h--) { border[h] = (uint8)(border[m] + (m - h) / k); } } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // @函数功能 总环岛识别处理函数 // @函数返回 无 //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void island_handler(void) { switch(current_state) { case NORMAL: //判断初见环岛条件 if(border_continuous(r_border) && !border_continuous(l_border) && find_point_A_l() && find_point_P_l())//判断是否为左环岛 { current_state = SEE_ISLAND; island_type = 1;//左环岛 } if(!border_continuous(r_border) && border_continuous(l_border) && find_point_A_r() && find_point_P_r())//判断是否为右环岛 { current_state = SEE_ISLAND; island_type = 2;//右环岛 } break; case SEE_ISLAND://初见环岛 if(island_type == 1)//左环岛 { //找A,P点 border_continuous(l_border); find_point_A_l(); find_point_P_l(); //补线 A_point = points_l[A_edge][1]; l_border[A_point] = points_l[A_edge][0]; patching_line(A_point,P_point,l_border,P_point); //判断初入环岛条件 if(l_border[MT9V03X_H-1] == border_min && l_border[MT9V03X_H-2] == border_min) { current_state = ENTER_ISLAND; } } if(island_type == 2)//右环岛 { //找A,P点 border_continuous(r_border); find_point_A_r(); find_point_P_r(); //补线 A_point = points_r[A_edge][1]; r_border[A_point] = points_r[A_edge][0]; patching_line(A_point,P_point,r_border,P_point); //判断初入环岛条件 if(r_border[MT9V03X_H-1] == border_max && r_border[MT9V03X_H-2] == border_max) { current_state = ENTER_ISLAND; } } break; case ENTER_ISLAND://初入环岛 if(island_type == 1)//左环岛 { //找P点 find_point_P_l(); //补线 A_point = MT9V03X_H-1; patching_line(A_point,P_point,l_border,P_point); //判断第一次到环岛出口条件 if(!border_continuous(l_border) && border_continuous(r_border) && find_point_V_l()) { current_state = EXIT_ISLAND1; } } if(island_type == 2)//右环岛 { //找P点 find_point_P_r(); //补线 A_point = MT9V03X_H-1; patching_line(A_point,P_point,r_border,P_point); //判断第一次到环岛出口条件 if(border_continuous(l_border) && !border_continuous(r_border) && find_point_V_r()) { current_state = EXIT_ISLAND1; } } break; case EXIT_ISLAND1://第一次到环岛出口 if(island_type == 1)//左环岛 { //找V点 border_continuous(l_border); find_point_V_l(); //补线 V_point = points_l[V_edge][1]; r_border[V_point] = points_l[A_edge][0]; patching_line(119,V_point,r_border,0); //判断即将入环条件 if(!border_continuous(r_border) && find_point_V_r()) { current_state = IN_ISLAND; } } if(island_type == 2)//右环岛 { //找V点 border_continuous(r_border); find_point_V_r(); //补线 V_point = points_r[V_edge][1]; l_border[V_point] = points_r[A_edge][0]; patching_line(119,V_point,l_border,0); //判断即将入环条件 if(!border_continuous(l_border) && find_point_V_l()) { current_state = IN_ISLAND; } } break; case PRE_ENTER://即将入环 if(island_type == 1)//左环岛 { //找V点 border_continuous(r_border); find_point_V_r(); //补线 V_point = points_r[V_edge][1]; r_border[V_point] = points_r[A_edge][0]; patching_line(119,V_point,r_border,0); //判断完全入环条件 if(border_continuous(r_border) && border_continuous(l_border)) { current_state = IN_ISLAND; } } if(island_type == 2)//右环岛 { //找V点 border_continuous(l_border); find_point_V_l(); //补线 V_point = points_l[V_edge][1]; l_border[V_point] = points_l[A_edge][0]; patching_line(119,V_point,l_border,0); //判断完全入环条件 if(border_continuous(r_border) && border_continuous(l_border)) { current_state = IN_ISLAND; } } break; case IN_ISLAND://完全入环 if(island_type == 1)//左环岛 { //条件补线 if(!border_continuous(r_border) && border_continuous(l_border)) { r_border[0] = border_min; patching_line(target_h,0,r_border,0); } //判断第二次到环岛出口条件 if( l_border[MT9V03X_H-1]>border_min && l_border[MT9V03X_H-2]>border_min && r_border[MT9V03X_H-1]==border_max && r_border[MT9V03X_H-1]==border_max) { current_state = EXIT_ISLAND2; } } if(island_type == 2)//右环岛 { //条件补线 if(!border_continuous(l_border) && border_continuous(r_border)) { l_border[0] = border_max; patching_line(target_h,0,l_border,0); } //判断第二次到环岛出口条件 if( l_border[MT9V03X_H-1]==border_min && l_border[MT9V03X_H-2]==border_min && r_border[MT9V03X_H-1]<border_max && r_border[MT9V03X_H-1]<border_max) { current_state = EXIT_ISLAND2; } } break; case EXIT_ISLAND2://第二次到环岛出口 if(island_type == 1)//左环岛 { //判断最终出环条件 if(!border_continuous(l_border) && border_continuous(r_border)) { current_state = FINAL_EXIT; } } if(island_type == 2)//右环岛 { //判断最终出环条件 if(border_continuous(l_border) && !border_continuous(r_border)) { current_state = FINAL_EXIT; } } break; case FINAL_EXIT://最终出环 if(island_type == 1)//左环岛 { //补线 border_continuous(l_border); patching_line(119,target_h,l_border,target_h); //结束条件 if(border_continuous(l_border) && border_continuous(r_border)) { current_state = NORMAL; island_type = 0; } } if(island_type == 2)//右环岛 { //补线 border_continuous(r_border); patching_line(119,target_h,r_border,target_h); //结束条件 if(border_continuous(l_border) && border_continuous(r_border)) { current_state = NORMAL; island_type = 0; } } break; } } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // @函数功能 获取车身偏差 // @函数返回 车身偏差error //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- int16 error = 1000; //误差100 int16 error_last = 0; //上次误差 void car_error(void) { uint8 i = 0; int32 num = 0; //int16 num = 0 for(i = 1;i < MT9V03X_H;i++) { num += (center_line[i] - (MT9V03X_W / 2)); } error_last = error; error = num; } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // @函数功能 最终处理函数 // @函数返回 无 //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- uint8 change = 0; uint8 change_last = 0; void image_process(void) { uint16 i; uint8 hightest = 0;//定义一个最高行,tip:这里的最高指的是y值的最小 Get_image(mt9v03x_image);//获得一副灰度图像 turn_to_bin();//大津法二值化。 //提取赛道边界 image_filter(bin_image);//滤波减少噪声 image_draw_rectan(bin_image);//给图像画黑框为八领域做准备 //清零 data_stastics_l = 0; data_stastics_r = 0; if (get_start_point(MT9V03X_H - 2))//找到起点了,再执行八领域,没找到就一直找 { navigation_flag = 0; //判断直角弯 uint8 m = 0,n = 0, j = 0; for(j = 1;j < MT9V03X_W;j++) { if(bin_image[60][j] == 255) { break; } if(bin_image[62][j] == 255) { break; } } if(j == MT9V03X_W) { for(j = 119;j > 55;j--) { if(bin_image[j][5] == 255 && bin_image[j][7] == 255) { m = 1; } if(bin_image[j][115] == 255 && bin_image[j][113] == 255) { n = 1; } } } if(m == 1 && n == 0) { navigation_flag = 1; } if(m == 0 && n == 1) { navigation_flag = 2; } //八领域处理 search_l_r((uint16)USE_num, bin_image, &data_stastics_l, &data_stastics_r, start_point_l[0], start_point_l[1], start_point_r[0], start_point_r[1], &hightest); // 从爬取的边界线内提取边线 , 这个才是最终有用的边线 get_left(data_stastics_l); get_right(data_stastics_r); //处理函数 island_handler();//环岛元素识别处理 } else { navigation_flag = 3; } for (i = hightest; i < MT9V03X_H-1; i++) { center_line[i] = (l_border[i] + r_border[i]) >> 1;//求中线 } if(bin_image[118][8] == 0 && bin_image[118][40] == 255 && bin_image[118][100] == 255 && bin_image[118][148] == 255 && bin_image[118][180] == 0 && bin_image[118][94] == 255) { change_last = change; change = 1; } else { change = 0; } if(change == 1 && change_last == 0) { stop++; } 以上代码如何调整参数来降低曝光问题

<template> <template v-if="companyInfo.companyCode"> <a-spin :spinning="isLoading" :delay="500" :tip="$t('加载中...')"> {{ $t('预案是否启用') }} <a-radio-group v-model="formData.enabled" :default-value="1"> <a-radio :value="1">{{ $t('启用') }}</a-radio> <a-radio :value="0">{{ $t('禁用') }}</a-radio> </a-radio-group> {{ $t('报警类型:') }} <a-select collapseTags mode="multiple" :maxTagCount="2" v-model="formData.type" allowClear placeholder="请选择" optionFilterProp="label" > <a-select-option v-for="(item, index) in typeOptions" :value="item.value" :key="index"> {{ item.label }} </a-select-option> </a-select> {{ $t('工单派发配置:') }} <a-table rowKey="department" :columns="columns" :dataSource="displayTableList" :scroll="{ x: '100%' }" :pagination="false" > <template slot="staff" slot-scope="text, record, index"> <a-select v-model="record.staffConfig" mode="multiple" placeholder="选择人员" optionFilterProp="label" :maxTagCount="2" allowClear @change="val => handleStaffChange(val, 'staffConfig', index)" > <a-select-option v-for="person in availableStaffMap[index]" :key="person.id" :label="person.name" :value="person.id" > {{ person.name }} </a-select-option> </a-select> </template> <template slot="time" slot-scope="text, record, index"> <a-select v-model="record.timeConfig" @change="val => changeTime(val, 'timeConfig', index)" placeholder="选择期望完成时间" > <a-select-option v-for="option in timeOptions" :key="option.value" :value="option.value"> {{ option.label }} </a-select-option> </a-select> </template> </a-table> <a-button @click="onSave" type="primary">{{ $t('确定') }}</a-button> <a-button @click="onCancel" type="normal">{{ $t('取消') }}</a-button> </a-spin> </template> </template> <script> export default { props: { orgInfo: { type: Object, default: () => { return {}; }, }, companyInfo: { type: Object, default: () => { return {}; }, }, }, data() { return { isLoading: false, formData: {}, typeOptions: [ { label: '选项1', value: 1, }, { label: '选项2', value: 2, }, { label: '选项3', value: 3, }, { label: '选项4', value: 4, }, ], columns: [ { title: '部门', key: 'department', dataIndex: 'department', ellipsis: true, }, { title: '用户', dataIndex: 'staff', scopedSlots: { customRender: 'staff' }, key: 'staff', }, { title: '期望完成时间设定', dataIndex: 'time', scopedSlots: { customRender: 'time' }, key: 'time', }, ], tableList: [ { department: '技术部', staffConfig: ['001', '002'], timeConfig: '24h' }, { department: '运维部', staffConfig: ['003'], timeConfig: '48h' }, { department: '安全部', staffConfig: [], timeConfig: '7d' }, { department: '网络部', staffConfig: [], timeConfig: '24h' }, { department: '数据库部', staffConfig: [], timeConfig: '12h' }, ], timeOptions: [ { label: '报警后12小时', value: '12h' }, { label: '报警后24小时', value: '24h' }, { label: '报警后48小时', value: '48h' }, { label: '报警后7日内', value: '7d' }, ], staffList: [ { id: '001', name: '张三' }, { id: '002', name: '李四' }, { id: '003', name: '王五' }, { id: '004', name: '赵六' }, ], }; }, computed: { // 所有被选中的用户ID(整个表格) allSelectedStaffIds() { const selected = new Set(); this.tableList.forEach(row => { if (Array.isArray(row.staffConfig)) { row.staffConfig.forEach(id => selected.add(id)); } }); return selected; }, // 为每一行生成可用人员列表 availableStaffMap() { const map = {}; const allSelected = this.allSelectedStaffIds; this.tableList.forEach((row, index) => { // 当前行已选的人员ID集合 const currentSelected = row.staffConfig ? new Set(row.staffConfig) : new Set(); // 过滤出当前行可用的人员 map[index] = this.staffList.filter(person => !allSelected.has(person.id) || currentSelected.has(person.id)); }); return map; }, // 用于显示的表数据(包含过滤后的人员显示) displayTableList() { return this.tableList.map((row, index) => { const availableStaff = this.availableStaffMap[index] || []; return { ...row, // 仅用于显示,不修改原始数据 displayStaffConfig: row.staffConfig.filter(id => availableStaff.some(p => p.id === id)), }; }); }, }, mounted() { console.log(this.allSelectedStaffIds, 'allSelectedStaffIdsallSelectedStaffIds'); console.log(this.availableStaffMap, 'availableStaffMap'); console.log(this.displayTableList, 'displayTableList'); // this.updateStatus(); }, methods: { changeTime(value, key, index) { this.$set(this.tableList[index], key, value); }, handleStaffChange(value, key, index) { // 人员只能选择两位 if (value && value.length > 2) { this.$message.destroy(); this.$message.warning('人员最多选择2位'); value = value.slice(0, 2); } this.$set(this.tableList[index], key, value); // this.updateStatus(); console.log(this.allSelectedStaffIds, 'allSelectedStaffIdsallSelectedStaffIds'); console.log(this.availableStaffMap, 'availableStaffMap'); console.log(this.displayTableList, 'displayTableList'); }, updateStatus() { const selectedIds = new Set(); this.tableList.forEach(row => { if (Array.isArray(row.staffConfig)) { row.staffConfig.forEach(id => selectedIds.add(id)); } }); this.staffList.forEach((person, index) => { const shouldDisable = selectedIds.has(person.id); if (person.disabled !== shouldDisable) { this.$set(this.staffList, index, { ...person, disabled: shouldDisable, }); } }); }, updateData(value, key, index) { this.$set(this.tableList[index], key, value); }, // 确定 onSave() { console.log('保存的数据:', { tableList: this.tableList, }); }, // 取消 onCancel() {}, }, }; </script> <style lang="less" scoped> .alarm-work-order { height: 100%; width: 100%; position: relative; box-sizing: border-box; .edit-view { width: 100%; padding: 46px 32px 24px 32px; .input-item { width: 100%; display: flex; margin-bottom: 22px; &:last-child { margin-bottom: 0 !important; } } .input-lable { width: 88px; min-width: 88px; justify-content: start; display: flex; color: #808e9d; font-size: 14px; line-height: 19px; margin-right: 24px; span { white-space: nowrap; } } .text-bold { font-weight: bold; color: #4e5c6b; } .text-align { align-items: center; } .btn-view { display: flex; align-items: center; justify-content: flex-start; padding-left: 112px; margin-top: 24px; & > button { margin-right: 12px; } } } } </style> 代码评审

<template> <template v-if="companyInfo.companyCode"> <a-spin :spinning="isLoading" :delay="500" :tip="$t('加载中...')"> {{ $t('预案是否启用') }} <a-radio-group v-model="formData.enabled" :default-value="1"> <a-radio :value="1">{{ $t('启用') }}</a-radio> <a-radio :value="0">{{ $t('禁用') }}</a-radio> </a-radio-group> {{ $t('报警类型:') }} <a-select collapseTags mode="multiple" :maxTagCount="2" v-model="formData.type" allowClear placeholder="请选择" optionFilterProp="label" > <a-select-option v-for="(item, index) in typeOptions" :value="item.value" :key="index"> {{ item.label }} </a-select-option> </a-select> {{ $t('工单派发配置:') }} <a-table rowKey="department" :columns="columns" :dataSource="tableList" :scroll="{ x: '100%' }" :pagination="false" > <template slot="staff" slot-scope="text, record, index"> <a-select v-model="record.staffConfig" mode="multiple" placeholder="选择人员" optionFilterProp="label" :maxTagCount="2" allowClear @change="val => handleStaffChange(val, 'staffConfig', index)" > <a-select-option v-for="person in staffList" :key="person.id" :label="person.name" :value="person.id" :disabled="person.disabled" > {{ person.name }} </a-select-option> </a-select> </template> <template slot="time" slot-scope="text, record, index"> <a-select v-model="record.timeConfig" @change="val => changeTime(val, 'timeConfig', index)" placeholder="选择期望完成时间" > <a-select-option v-for="option in timeOptions" :key="option.value" :value="option.value"> {{ option.label }} </a-select-option> </a-select> </template> </a-table> <a-button @click="onSave" type="primary">{{ $t('确定') }}</a-button> <a-button @click="onCancel" type="normal">{{ $t('取消') }}</a-button> </a-spin> </template> </template> <script> export default { props: { orgInfo: { type: Object, default: () => { return {}; }, }, companyInfo: { type: Object, default: () => { return {}; }, }, }, data() { return { isLoading: false, formData: {}, typeOptions: [ { label: '选项1', value: 1, }, { label: '选项2', value: 2, }, { label: '选项3', value: 3, }, { label: '选项4', value: 4, }, ], columns: [ { title: '部门', key: 'department', dataIndex: 'department', ellipsis: true, }, { title: '用户', dataIndex: 'staff', scopedSlots: { customRender: 'staff' }, key: 'staff', }, { title: '期望完成时间设定', dataIndex: 'time', scopedSlots: { customRender: 'time' }, key: 'time', }, ], tableList: [ { department: '技术部', staffConfig: ['001', '002'], timeConfig: '24h', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, { department: '技术部', staffConfig: [], timeConfig: '7d', }, ], timeOptions: [ { label: '报警后12小时', value: '12h' }, { label: '报警后24小时', value: '24h' }, { label: '报警后48小时', value: '48h' }, { label: '报警后7日内', value: '7d' }, ], staffList: [], checkedUser: [], }; }, mounted() { this.staffList = [ { id: '001', name: '张三' }, { id: '002', name: '李四' }, { id: '003', name: '王五' }, { id: '004', name: '赵六' }, ]; this.updateStatus(); }, methods: { changeTime(value, key, index) { this.updateData(value, key, index); }, handleStaffChange(value, key, index) { // 人员只能选择两位 if (value && value.length > 2) { this.$message.destroy(); return this.$message.warning('人员最多选择2位'); } this.updateData(value, key, index); this.updateStatus(); }, updateStatus() { const selectedIds = new Set(); this.tableList.forEach(row => { if (Array.isArray(row.staffConfig)) { row.staffConfig.forEach(id => selectedIds.add(id)); } }); this.staffList.forEach((person, index) => { const shouldDisable = selectedIds.has(person.id); if (person.disabled !== shouldDisable) { this.$set(this.staffList, index, { ...person, disabled: shouldDisable, }); } }); }, updateData(value, key, index) { const target = this.tableList[index]; if (target) this.$set(target, key, value); }, // 确定 onSave() {}, // 取消 onCancel() {}, }, }; </script> <style lang="less" scoped> .alarm-work-order { height: 100%; width: 100%; position: relative; box-sizing: border-box; .edit-view { width: 100%; padding: 46px 32px 24px 32px; .input-item { width: 100%; display: flex; margin-bottom: 22px; &:last-child { margin-bottom: 0 !important; } } .input-lable { width: 88px; min-width: 88px; justify-content: start; display: flex; color: #808e9d; font-size: 14px; line-height: 19px; margin-right: 24px; span { white-space: nowrap; } } .text-bold { font-weight: bold; color: #4e5c6b; } .text-align { align-items: center; } .btn-view { display: flex; align-items: center; justify-content: flex-start; padding-left: 112px; margin-top: 24px; & > button { margin-right: 12px; } } } } </style> 代码评审

大家在看

recommend-type

自动控制原理课件

上海交大自动控制原理英文班课件,王伟和陈彩莲老师
recommend-type

毕业设计&课设-用Matlab编写的MUSIC算法实现毫米波OFDM信号的4D ISAC成像仿真.zip

matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随
recommend-type

B端产品经理必备:AntDesign3.9.x-Axure-20180903 Axure元件库

B端产品经理必备:AntDesign3.9.x_Axure_20180903 Axure元件库 包含布局、按钮、图标、面包屑、导航菜单、标签页、步骤条、表单、输入框、选择器、评分、上传、穿梭框、图标库、卡片、时间轴、树形控件、图表卡片、标签、提示、抽屉、警告、对话框、进度条、气泡确认框、信息板、列表页、详情页、结果页、个人页等全部组件原型
recommend-type

海康sdkC#封装及调用例子

C#封装了海康sdk 1.登录摄像头功能 2.登出摄像头功能 3.抓图 4.开始录制视频结束录制视频 5.布防 6.布防回调(移动侦测报警,门禁主机报警信息,门禁身份证刷卡信息,门禁通行人数信息) 7.撤消布防
recommend-type

system verilog for design 2nd edition

this book introduces how to model a hardware description code using system verilog effectively

最新推荐

recommend-type

输入框限制输入两位小数数字

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这是一个非常实用且易于上手的网页代码片段,它通过JavaScript实现了对输入框内容的精准校验,确保用户只能输入数字以及最多保留小数点后两位(该位数可根据实际需求灵活调整为任意n位)。与网上常见的校验方法相比,它具有显著的直观性和易用性,尤其适合初学者快速理解和应用。此代码片段封装在一个静态网页文件中,方便直接使用和修改。它经过精心设计,能够完美兼容Internet Explorer(IE)、Firefox(FF)、Chrome等主流浏览器,无需担心兼容性问题。用户可以根据自己的需求轻松调整小数点后保留的位数,操作简单便捷,大大提高了开发效率。
recommend-type

2022版微信自定义密码锁定程序保护隐私

标题《微信锁定程序2022,自定义密码锁》和描述“微信锁定程序2022,自定义密码锁,打开微信需要填写自己设定的密码,才可以查看微信信息和回复信息操作”提及了一个应用程序,该程序为微信用户提供了额外的安全层。以下是对该程序相关的知识点的详细说明: 1. 微信应用程序安全需求 微信作为一种广泛使用的即时通讯工具,其通讯内容涉及大量私人信息,因此用户对其隐私和安全性的需求日益增长。在这样的背景下,出现了第三方应用程序或工具,旨在增强微信的安全性和隐私性,例如我们讨论的“微信锁定程序2022”。 2. “自定义密码锁”功能 “自定义密码锁”是一项特定功能,允许用户通过设定个人密码来增强微信应用程序的安全性。这项功能要求用户在打开微信或尝试查看、回复微信信息时,必须先输入他们设置的密码。这样,即便手机丢失或被盗,未经授权的用户也无法轻易访问微信中的个人信息。 3. 实现自定义密码锁的技术手段 为了实现这种类型的锁定功能,开发人员可能会使用多种技术手段,包括但不限于: - 加密技术:对微信的数据进行加密,确保即使数据被截获,也无法在没有密钥的情况下读取。 - 应用程序层锁定:在软件层面添加一层权限管理,只允许通过验证的用户使用应用程序。 - 操作系统集成:与手机操作系统的安全功能进行集成,利用手机的生物识别技术或复杂的密码保护微信。 - 远程锁定与擦除:提供远程锁定或擦除微信数据的功能,以应对手机丢失或被盗的情况。 4. 微信锁定程序2022的潜在优势 - 增强隐私保护:防止他人未经授权访问微信账户中的对话和媒体文件。 - 防止数据泄露:在手机丢失或被盗的情况下,减少敏感信息泄露的风险。 - 保护未成年人:父母可以为孩子设定密码,控制孩子的微信使用。 - 为商业用途提供安全保障:在商务场合,微信锁定程序可以防止商业机密的泄露。 5. 使用微信锁定程序2022时需注意事项 - 正确的密码管理:用户需要记住设置的密码,并确保密码足够复杂,不易被破解。 - 避免频繁锁定:过于频繁地锁定和解锁可能会降低使用微信的便捷性。 - 兼容性和更新:确保微信锁定程序与当前使用的微信版本兼容,并定期更新以应对安全漏洞。 - 第三方应用风险:使用第三方应用程序可能带来安全风险,用户应从可信来源下载程序并了解其隐私政策。 6. 结语 微信锁定程序2022是一个创新的应用,它提供了附加的安全性措施来保护用户的微信账户。尽管在实施中可能会面临一定的挑战,但它为那些对隐私和安全有更高要求的用户提供了可行的解决方案。在应用此类程序时,用户应谨慎行事,确保其对应用程序的安全性和兼容性有所了解,并采取适当措施保护自己的安全密码。
recommend-type

【自动化脚本提速】:掌握序列生成的5种高效技巧

# 摘要 本文系统地阐述了自动化脚本提速的方法,重点介绍了序列生成的基础理论及其在脚本中的应用。通过探讨不同序列生成方法和高效技巧,本文旨在提高编程效率,优化自动化流程。同时,文中还涉及了高级技术,如嵌套循环、列表推导式和并行处理,这些技术不仅增加了序列生成的复杂性,同时也显著提升了效率。最后,本文通过综合案例分析,展示了一系列序列生成技巧的实际应用,并提出了优化建议和未来研究方向。 #
recommend-type

卷积神经网络中的分层!

<think>我们正在处理一个关于卷积神经网络(CNN)层级结构的问题。用户希望了解CNN的层级结构及其功能。根据提供的引用内容,我们可以整理出以下信息: 1. 引用[1]和[2]指出,一个完整的卷积神经网络通常包括以下层级: - 数据输入层(Input layer) - 卷积计算层(CONV layer) - ReLU激励层(ReLU layer) - 池化层(Pooling layer) - 全连接层(FC layer) - (可能还有)Batch Normalization层 2. 引用[2]详细说明了各层的作用: - 数据输入层:对原始图像
recommend-type

MXNet预训练模型介绍:arcface_r100_v1与retinaface-R50

根据提供的文件信息,我们可以从中提取出关于MXNet深度学习框架、人脸识别技术以及具体预训练模型的知识点。下面将详细说明这些内容。 ### MXNet 深度学习框架 MXNet是一个开源的深度学习框架,由Apache软件基金会支持,它在设计上旨在支持高效、灵活地进行大规模的深度学习。MXNet支持多种编程语言,并且可以部署在不同的设备上,从个人电脑到云服务器集群。它提供高效的多GPU和分布式计算支持,并且具备自动微分机制,允许开发者以声明性的方式表达神经网络模型的定义,并高效地进行训练和推理。 MXNet的一些关键特性包括: 1. **多语言API支持**:MXNet支持Python、Scala、Julia、C++等语言,方便不同背景的开发者使用。 2. **灵活的计算图**:MXNet拥有动态计算图(imperative programming)和静态计算图(symbolic programming)两种编程模型,可以满足不同类型的深度学习任务。 3. **高效的性能**:MXNet优化了底层计算,支持GPU加速,并且在多GPU环境下也进行了性能优化。 4. **自动并行计算**:MXNet可以自动将计算任务分配到CPU和GPU,无需开发者手动介入。 5. **扩展性**:MXNet社区活跃,提供了大量的预训练模型和辅助工具,方便研究人员和开发者在现有工作基础上进行扩展和创新。 ### 人脸识别技术 人脸识别技术是一种基于人的脸部特征信息进行身份识别的生物识别技术,广泛应用于安防、监控、支付验证等领域。该技术通常分为人脸检测(Face Detection)、特征提取(Feature Extraction)和特征匹配(Feature Matching)三个步骤。 1. **人脸检测**:定位出图像中人脸的位置,通常通过深度学习模型实现,如R-CNN、YOLO或SSD等。 2. **特征提取**:从检测到的人脸区域中提取关键的特征信息,这是识别和比较不同人脸的关键步骤。 3. **特征匹配**:将提取的特征与数据库中已有的人脸特征进行比较,得出最相似的人脸特征,从而完成身份验证。 ### 预训练模型 预训练模型是在大量数据上预先训练好的深度学习模型,可以通过迁移学习的方式应用到新的任务上。预训练模型的优点在于可以缩短训练时间,并且在标注数据较少的新任务上也能获得较好的性能。 #### arcface_r100_v1 arcface_r100_v1是一个使用ArcFace损失函数训练的人脸识别模型,基于ResNet-100架构。ArcFace是一种流行的深度学习人脸识别方法,它在损失函数层面上增强类间的区分度。在ArcFace中,通过引入角度余弦的特征分离度,改善了传统的Softmax损失函数,让学习到的人脸特征更加具有鉴别力。 ArcFace的模型文件包括: - model-0000.params: 这是模型权重参数文件。 - model-symbol.json: 这是包含网络结构定义的JSON文件。 #### retinaface-R50 retinaface-R50是基于ResNet-50架构的人脸检测模型,使用RetinaFace框架训练而成。RetinaFace是为了解决传统人脸检测模型在面对小尺寸、遮挡、模糊等复杂情况时识别准确度不高的问题而设计的。它采用一种基于多尺度的金字塔网络结构,能有效处理不同尺度的人脸,并且在特征提取时采用了一种高效的特征融合策略。 Retinaface-R50的模型文件包括: - R50-0000.params: 这是模型权重参数文件。 - R50-symbol.json: 这是包含网络结构定义的JSON文件。 ### 总结 从给定的文件信息中,我们可以看出这些预训练模型是基于MXNet深度学习框架开发的,具有专门针对人脸识别任务的优化。ArcFace模型通过增强特征的区分度,而Retinaface模型通过多尺度处理和高效的特征融合,都展示了在人脸检测和识别方面的先进技术。开发者可以利用这些预训练模型,结合MXNet提供的高级API,快速构建并部署自己的人脸识别解决方案。
recommend-type

【文本处理黑科技】:Shell脚本中序列和数组的高级应用

# 摘要 本文系统地介绍了Shell脚本中序列与数组的基础知识、操作技巧以及在实际应用中的优化方法。第一章和第二章分别对序列和数组的基础知识进行了阐述,重点讲解了序列的生成、操作、文本处理和数组的基本操作与高级特性。第三章探讨了数组在数据处理和内存管理中的性能优势。第四章结合实际案例,展示了序列与数组在日志文件分析、报告生成和配置文件管理
recommend-type

数据库用来干啥的

<think>首先,用户的问题是:“我想了解数据库的用途 请问数据库的主要用途是什么”。这翻译成英文是:“I want to understand the purpose of databases. What are the main uses of databases?” 从系统级指令中,我需要: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 - 结构清晰,帮助用户逐步解决问题。 - 回答真实可
recommend-type

微软文字转语音软件发布,支持多国语言高精度识别

微软文字转语音V1.0.zip这个文件包含了一个软件程序,该程序能够实现文字到语音(Text-to-Speech,TTS)的转换,同时也提供了从音频文件到文字的转换功能。下面详细介绍这一技术及其应用的知识点。 首先,文字到语音转换技术,通常称为TTS技术,是计算机科学中的一个重要分支。TTS系统主要由三个关键部分构成:文本分析模块、语音合成模块和声音输出模块。文本分析模块负责理解输入文本的结构和含义,包括分词、词性标注、句法分析、语义分析等。语音合成模块则负责根据文本分析的结果,合成出自然的语音波形。声音输出模块则是将合成的语音波形转换为可听的声音。 微软文字转语音软件具有以下功能和特点: 1. 智能文字和语音互转:该软件能够将用户输入的文字信息转换成自然流畅的语音输出,同时也能将音频文件中的对话转换成文字文本。这种双向转换功能对于多种场景有着重要的应用价值,比如辅助视障人士、提供语音交互界面、制作多语种的语音内容等。 2. 高精度识别各国语言:软件支持高精度的语言识别功能,能处理多种语言的文本或音频。不同语言有不同的语法结构和发音特点,因此支持多语言识别需要对每一种语言都进行深入的研究和算法优化,以确保转换结果的准确性和自然度。 3. 一键拖拽,批量完成:该软件提供简便的操作界面,用户可以通过简单的拖拽动作将需要转换的文本或音频文件直接加入到软件中,进行批量处理。这种操作方式极大地方便了用户,提高了工作效率,尤其在处理大量数据时优势更加明显。 4. 各种音频格式任意选择:用户可以根据需要选择输出的音频格式,比如常见的MP3、WAV等,以便适用于不同的播放设备或播放环境。不同音频格式有其特定的用途,例如MP3格式因为压缩比例高而被广泛用于网络传输和便携式设备,而WAV格式则多用于专业的音频编辑和制作。 软件包中的“resources”文件夹可能包含了支持软件运行的资源文件,如语音合成引擎所需的语音库、语言模型、字典等。而“转换结果”文件夹则可能是软件保存转换后文件的默认位置,用户可以在这里找到转换完成的文字或音频文件。 此外,软件包中的“微软文字转语音V1.0.exe”是一个可执行文件,用户通过运行该文件来启动软件,并使用其提供的各项转换功能。对于IT行业专业人士而言,了解这款软件背后的TTS技术原理和操作逻辑,可以更好地选择合适的解决方案,以满足特定的业务需求。 总结来说,微软文字转语音V1.0.zip中的软件是一款综合性的文字语音转换工具,具有高精度语言识别、高效批量处理、灵活音频格式选择等特点,可以应用于多种场景,提高信息的可访问性和交互性。
recommend-type

【Shell脚本必备】:创建序列的3种方法及高效用法

# 摘要 本文全面探讨了在Shell脚本中创建和优化序列生成的各种方法及其应用场景。首先介绍了序列生成的基本概念和使用基本命令创建序列的技巧,包括for循环、seq命令和算术表达式的应用。随后,深入分析了利用高级Shell特性如数组、复合命令和子shell、以及C风格的for循环来创建复杂序列的技术。文章还探讨了序列在文件批量处理、数据处理分析和自动化脚本中的高效应用。此外,为提升
recommend-type

mac烤机软件

<think>嗯,用户需要寻找适用于Mac的烤机测试软件。首先,我需要理解"烤机测试"的含义。这通常指的是压力测试,通过让电脑在高负载下运行,检测其稳定性和散热性能。用户可能刚买了新Mac,或者升级了系统,想测试机器在极端情况下的表现。 回顾提供的引用,其中提到了一些相关软件。引用[1]中的TechTool Pro被描述为Mac上强大的测试维护工具,能进行多种扫描,符合烤机测试的需求。引用[2]提到Mac mini的性能测试使用了FIO工具,但这是针对存储性能的,可能不全面。引用[4]提到xbench,但似乎已停止更新,可能不适合最新系统。 用户的需求是压力测试软件,需要覆盖CPU、GPU