安装依赖

在Ubuntu 20.04上安装ROS Noetic,确保系统已配置ROS环境。安装OpenCV和Tesseract OCR库:

sudo apt-get update
sudo apt-get install ros-noetic-cv-bridge ros-noetic-image-transport ros-noetic-tesseract-ocr tesseract-ocr-eng libtesseract-dev

创建ROS包

创建一个名为license_plate_ocr的ROS包:

cd ~/catkin_ws/src
catkin_create_pkg license_plate_ocr roscpp std_msgs cv_bridge image_transport
cd ~/catkin_ws && catkin_make

编写OCR识别节点

license_plate_ocr/src目录下创建ocr_node.cpp文件,内容如下:

#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <opencv2/opencv.hpp>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

void imageCallback(const sensor_msgs::ImageConstPtr& msg) {
    cv_bridge::CvImagePtr cv_ptr;
    try {
        cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
    } catch (cv_bridge::Exception& e) {
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }

    cv::Mat gray;
    cv::cvtColor(cv_ptr->image, gray, cv::COLOR_BGR2GRAY);
    cv::GaussianBlur(gray, gray, cv::Size(3, 3), 0);
    cv::threshold(gray, gray, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

    tesseract::TessBaseAPI ocr;
    ocr.Init(NULL, "eng", tesseract::OEM_LSTM_ONLY);
    ocr.SetPageSegMode(tesseract::PSM_AUTO);
    ocr.SetImage(gray.data, gray.cols, gray.rows, 1, gray.step);

    char* text = ocr.GetUTF8Text();
    std::string plate_text(text);
    if (!plate_text.empty()) {
        ROS_INFO("Detected License Plate: %s", plate_text.c_str());
    } else {
        ROS_WARN("No license plate detected.");
    }
    delete[] text;
}

int main(int argc, char** argv) {
    ros::init(argc, argv, "license_plate_ocr");
    ros::NodeHandle nh;
    image_transport::ImageTransport it(nh);
    image_transport::Subscriber sub = it.subscribe("/camera/image_raw", 1, imageCallback);
    ros::spin();
    return 0;
}

修改CMakeLists.txt

license_plate_ocr包的CMakeLists.txt中添加以下内容:

find_package(OpenCV REQUIRED)
find_package(Tesseract REQUIRED)

add_executable(ocr_node src/ocr_node.cpp)
target_link_libraries(ocr_node ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} ${Tesseract_LIBRARIES})

编译并运行

编译ROS包并运行节点:

cd ~/catkin_ws && catkin_make
source devel/setup.bash
rosrun license_plate_ocr ocr_node

测试数据

使用image_publisher发布测试图像:

rosrun image_publisher image_publisher_node /path/to/license_plate_image.jpg

输出结果

终端将打印识别到的车牌号,格式如下:

[INFO] [WallTime: 123456789.0] Detected License Plate: ABC123

常见误操作场景分类
  1. 提交相关错误

    • 提交了错误的文件或内容
    • 提交信息写错需修改
    • 漏提交文件需补充
  2. 分支操作错误

    • 误删分支
    • 错误合并或变基导致冲突
    • 分支切换错误
  3. 历史记录操作错误

    • 误用git reset导致提交丢失
    • 误用git rebase破坏提交历史
  4. 远程仓库操作错误

    • 误强制推送覆盖远程提交
    • 误删远程分支或标签
急救方法与命令

撤销未推送的本地提交

  • 修改最后一次提交:
    git commit --amend
    

  • 回退到指定提交(保留更改):
    git reset --soft <commit-hash>
    

  • 彻底丢弃提交(慎用):
    git reset --hard <commit-hash>
    

恢复误删的分支

  • 通过reflog找回分支指针:
    git reflog
    git checkout -b <branch-name> <commit-hash>
    

修复错误合并/变基

  • 终止合并并还原:
    git merge --abort
    git rebase --abort
    

  • 手动解决冲突后继续:
    git add <resolved-file>
    git rebase --continue
    

恢复远程仓库覆盖

  • 从本地reflog找回历史提交并强制推送:
    git push origin <branch-name> --force
    

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐