findline

本文介绍了一个bash脚本,用于在当前文件夹及其子目录下查找特定文本或正则表达式。脚本支持忽略大小写、静默模式、显示行号、排除注释行等功能,并可以指定文件后缀。
#!/bin/bash

######################################################
# file name: findline                                #
# find lines in files, recursively in current folder #
######################################################

ME=`basename $0`

showHelp()
{
  echo "usage $ME -h"
  echo "usage $ME [-i] [-s] [-n] [-c] -e regex_pattern [file_suffix1] [file_suffix2] [...]"
  echo "usage $ME [-i] [-s] [-n] [-c] text_pattern [file_suffix1] [file_suffix2] [...]"
  echo "usage $ME [-l] [-s] [-i] [-c] -e regex_pattern | text_pattern [file_suffix1] [file_suffix2] [...]"
  echo "usage $ME [-l] [-s] [-i] [-c] text_pattern [file_suffix1] [file_suffix2] [...]"
  echo "-h: show help"
  echo "-i: ignore case"
  echo "-s: silence mode, do not show command"
  echo "-n: show line number"
  echo "-c: exclude comment line, which is start with #"
  echo "-e: regex pattern"
  echo "-l: list file name only, will use -n by default"
  echo "The file suffix is case insensitive"
}

INVALID=1
IGNORE_CASE=1
REGEX=1
SILENCE=1
NUMBER=1
COMMENT=1
LIST=1

# check arguments
while getopts :ilhscne: OPTION
do
  case $OPTION in
    i) IGNORE_CASE=0
       ;;
    s) SILENCE=0
       ;;
    e) REGEX=0
       PATTERN=$OPTARG
       ;;
    n) NUMBER=0
       ;;
    c) COMMENT=0
       ;;
    l) LIST=0
       ;;
    h) showHelp
       exit 0
       ;;  
    *) INVALID=0
       ;;
  esac
done

# user input invalid arguments
[ $INVALID -eq 0 -o $# -eq 0 ] && showHelp && exit 1

#echo $OPTIND

# shift to pattern arg position
shift `expr $OPTIND - 1`
 
if [ $REGEX -ne 0 ]
then
  PATTERN=$1
fi

# no pattern arg was assigned
[ -z "$PATTERN" ] && showHelp && exit 1

# if no -e was specified, use next args as suffixes
[ $REGEX -ne 0 ] && shift
SUFFIX=$*

# set exec args for options
[ $IGNORE_CASE -eq 0 ] && IGNORE_CASE_ARG="-i"
[ $REGEX -eq 0 ] && REGEX_ARG="-E \"$PATTERN\"" || REGEX_ARG=\"$PATTERN\"
[ $NUMBER -eq 0 ] && NUMBER_ARG=" | nl"
[ $COMMENT -eq 0 ] && COMMENT_ARG=" | grep -E -v '^.+:[0-9]+:\s*#'"

if [ -n "$SUFFIX" ]
then
  for VAR in $SUFFIX
  do
    S=$S"|"$VAR
  done
 
  SUFFIX_PATTERN=`echo $S | sed 's/|//'`
  SUFFIX_ARG=" | grep -i -E \"\.($SUFFIX_PATTERN‘)\$\""
fi

RET=0

# find command
if [ $LIST -ne 0 ]
then
  # show find lines
  CMD="find . -print0 -type f -follow -name \"*\" 2>/dev/null | xargs -0 ls -d | awk '{ORS=\"\";print\"'\\''\";print\$0;print\"'\\''\";print\"\\n\"}' $SUFFIX_ARG | xargs grep -n -H $IGNORE_CASE_ARG $REGEX_ARG $COMMENT_ARG $NUMBER_ARG | sort"
else
  # show file list
  CMD="find . -print0 -type f -follow -name \"*\" 2>/dev/null | xargs -0 ls -d | awk '{ORS=\"\";print\"'\\''\";print\$0;print\"'\\''\";print\"\\n\"}' $SUFFIX_ARG | xargs grep -n -H $IGNORE_CASE_ARG $REGEX_ARG $COMMENT_ARG | grep ":" | cut -d: -f1 | sort -u"
fi

# display find command
[ $SILENCE -eq 0 ] || echo $CMD

if [ $LIST -ne 0 ]
then
  # execute show find lines
  eval $CMD
else
  # execute show file list
  FILES=(`eval "$CMD"`)
  INDEX=0
  while [ $INDEX -lt ${#FILES[*]} ]
  do
    NO=`expr $INDEX + 1`
    echo "$NO.   ${FILES[$INDEX]}"
    eval "_$NO=${FILES[$INDEX]}"
    INDEX=$NO
  done
 
  if [ ${#FILES[*]} -gt 0 ]
  then
    # execute command
    echo -e "Input command('\$_n' as file name):\c"
    read TMP
    
    if [ -n "$TMP" ]
    then
      COMMAND="$TMP 2>/dev/null"
      eval $COMMAND
    fi
  fi
fi

RET=$?

exit $RET


MaixCAM 是一款基于 Kendryte K210 芯片的嵌入式视觉开发设备,支持图像采集、处理和模式识别等功能。其 `find_line` 功能是用于巡线检测的核心方法之一,在机器人导航、路径追踪等场景中具有广泛应用。 ### 使用方法 在 MaixCAM 上使用 `find_line` 功能通常涉及以下步骤: 1. **初始化摄像头**:设置图像分辨率、格式(如 RGB565 或 GRAYSCALE)等参数。 2. **图像预处理**:包括灰度化、二值化等操作以提高线条识别的准确性。 3. **调用 find_line 函数**:传入图像对象及相关参数进行线段查找。 4. **获取结果并绘制**:提取检测到的线段信息并在图像上绘制出来。 以下是一个基本的 Python 示例代码,展示如何使用 MaixPy 实现 `find_line` 功能: ```python import sensor, image, time # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.GRAYSCALE) # 设置为灰度图 sensor.set_framesize(sensor.QVGA) # 设置分辨率为320x240 sensor.skip_frames(time=2000) # 等待设置生效 clock = time.clock() while(True): clock.tick() img = sensor.snapshot() # 获取图像 # 使用find_line查找线段 lines = img.find_line(threshold=1000) if lines: for line in lines: # 绘制检测到的线段 img.draw_line(line.line(), color=(255, 0, 0)) # 红色线段 print(clock.fps()) ``` ### 实现原理 `find_line` 的实现依赖于图像处理算法,主要包括以下几个关键步骤: - **边缘检测**:通过 Canny、Sobel 等算法检测图像中的边缘。 - **霍夫变换(Hough Transform)**:将图像空间中的点映射到参数空间,从而识别直线[^1]。 - **阈值筛选**:设定长度、角度等条件过滤无效线段,保留符合预期的线条。 该功能在实际应用中可能会受到光照变化、背景干扰等因素影响,因此常常需要结合图像增强(如直方图均衡化)、滤波(如高斯滤波)等技术来提升鲁棒性。 ### 提升帧率与抗干扰性的建议 由于图像处理对性能要求较高,若希望在保持精度的同时提高帧率,可尝试以下优化手段: - **降低图像分辨率**:虽然引用资料中提到在 320×240 分辨率下帧率为 20~30 FPS,但仍可通过进一步缩小尺寸获得更高帧率[^1]。 - **硬件加速**:利用 K210 的 NPU 加速图像处理流程,尤其是卷积运算相关任务。 - **选择性处理**:只对图像中感兴趣区域(ROI)进行线段检测,减少计算量。 - **自适应二值化**:根据环境动态调整阈值,提升抗干扰能力。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值