精华内容
下载资源
问答
  • opencv图像识别训练实例

    万次阅读 多人点赞 2018-10-17 20:35:10
    本文按照如下顺序来进行详细解释如何进行图像识别训练过程: 制作图像 图像数据 图像训练 图像识别实例 选取图像集 我这里下载了12张杨幂的照片作为数据集来提取脸部照片ROI。 #include <QApplication...

    我一度以为图像训练会很难,觉得很高深,直到我亲自做了一个图像的训练才认识到如果仅仅是单纯地学习和使用,真的很简单。

    本文按照如下顺序来进行详细解释如何进行图像识别训练过程:

    1. 制作图像
    2. 图像数据
    3. 图像训练
    4. 图像识别实例

    选取图像集

    我这里下载了12张杨幂的照片作为数据集来提取脸部照片ROI。

    #include <QApplication>
    
    #include "opencv2/opencv.hpp"
    
    #include <QDebug>
    
    using namespace cv;
    
    
    /** Function Headers */
    void detectAndDisplay(Mat frame);
    
    /** Global variables */
    String face_cascade_name = "../haarcascade_frontalface_default.xml";
    String eyes_cascade_name = "../haarcascade_eye_tree_eyeglasses.xml";
    CascadeClassifier face_cascade;   //定义人脸分类器
    CascadeClassifier eyes_cascade;   //定义人眼分类器
    String window_name = "Capture - Face detection";
    
    
    
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        int i = 1;
        for(; i < 13; i++)
        {
            string  str_path = format("../imgs/ym/%d.jpg", i);
            Mat frame = imread(str_path);
            if (!face_cascade.load(face_cascade_name))
            {
                printf("--(!)Error loading face cascade\n");
                return -1;
            }
            if (!eyes_cascade.load(eyes_cascade_name))
            {
                printf("--(!)Error loading eyes cascade\n");
                return -1;
            }
            detectAndDisplay(frame);
    
        }
        return a.exec();
    }
    
    
    
    void detectAndDisplay(Mat frame)
    {
        static int num = 1;
        std::vector<Rect> faces;
        Mat frame_gray;
    
        cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
        //直方图均衡化
        equalizeHist(frame_gray, frame_gray);
    
        //-- Detect faces
        //face_cascade.detectMultiScale(frame_gray, faces, 1.1, 5, 0 | CV_HAAR_SCALE_IMAGE, Size(5, 5));
    
        face_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, CV_HAAR_DO_ROUGH_SEARCH, Size(50, 50));
    
        qDebug()<< "faces number:" << faces.size();
        for (size_t i = 0; i < faces.size(); i++)
        {
            num++;
            //Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
            //ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
            rectangle(frame, faces[i],Scalar(255,0,0),2,8,0);
    
            Mat faceROI = frame_gray(faces[i]);
            Mat MyFace;
            if (faceROI.cols > 100)
            {
                resize(faceROI, MyFace, Size(92, 112));
                string  str = format("../generateFaces/MyFcae%d.pgm", num);
                imwrite(str, MyFace);
                imshow("ii", MyFace);
            }
    
    
            std::vector<Rect> eyes;
    
            //-- In each face, detect eyes
            eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 1, CV_HAAR_DO_ROUGH_SEARCH, Size(3, 3));
    
            for (size_t j = 0; j < eyes.size(); j++)
            {
                Rect rect(faces[i].x + eyes[j].x, faces[i].y + eyes[j].y, eyes[j].width, eyes[j].height);
    
                //Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
                //int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
                //circle(frame, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
                rectangle(frame, rect, Scalar(0, 255, 0), 2, 8, 0);
            }
        }
        //-- Show what you got
        namedWindow(window_name, 2);
        imshow(window_name, frame);
    }
    

     

    图像数据

    本次用的数据集市opencv给出的教程里面的第一个数据集:The AT&T Facedatabase。又称ORL人脸数据库,40个人,

    数据集地址:https://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html

    可以直接下载。下载完毕解压后是40个文件夹(s1-s40,每个文件夹中包含10张图片)每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。

    我们添加我们自己的图像文件夹s41,并且添加上一步骤生成的ROI图。

    拷贝opencv-2.4.13.3/modules/contrib/doc/facerec/src/create_csv.py到程序生成目录,然后对其做相应的修改(注意这里必须要把路径写正确,否则训练时会由于路径不正确引发运行错误,这一点对新手来说打击还是挺大的)。

    运行create_csv.py生成at.txt

    图像训练

    #include <QApplication>
    
    #include "opencv2/opencv.hpp"
    #include "opencv2/contrib/contrib.hpp"
    
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <math.h>
    
    #include <QDebug>
    
    using namespace cv;
    using namespace std;
    
    
    static Mat norm_0_255(InputArray _src) {
        Mat src = _src.getMat();
        // 创建和返回一个归一化后的图像矩阵:
        Mat dst;
        switch (src.channels()) {
        case1:
            cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
            break;
        case3:
            cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
            break;
        default:
            src.copyTo(dst);
            break;
        }
        return dst;
    }
    
    
    //使用CSV文件去读图像和标签,主要使用stringstream和getline方法
    static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {
        std::ifstream file(filename.c_str(), ifstream::in);
        if (!file) {
            string error_message = "No valid input file was given, please check the given filename.";
            CV_Error(CV_StsBadArg, error_message);
        }
        string line, path, classlabel;
        while (getline(file, line)) {
            stringstream liness(line);
            getline(liness, path, separator);
            getline(liness, classlabel);
            if (!path.empty() && !classlabel.empty()) {
                images.push_back(imread(path, 0));
                labels.push_back(atoi(classlabel.c_str()));
            }
        }
    }
    
    
    
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //读取你的CSV文件路径.
        //string fn_csv = string(argv[1]);
        string fn_csv = "at.txt";
    
        // 2个容器来存放图像数据和对应的标签
        vector<Mat> images;
        vector<int> labels;
        // 读取数据. 如果文件不合法就会出错
        // 输入的文件名已经有了.
        try
        {
            read_csv(fn_csv, images, labels);
        }
        catch (cv::Exception& e)
        {
            cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
            exit(1);
        }
    
        qDebug() << "read_csv ok";
        qDebug() << "images.size(): " << images.size();
        // 如果没有读取到足够图片,也退出.
        if (images.size() <= 1) {
            string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
            CV_Error(CV_StsError, error_message);
        }
    
        // 下面的几行代码仅仅是从你的数据集中移除最后一张图片
        //[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题]
        Mat testSample = images[images.size() - 1];
        int testLabel = labels[labels.size() - 1];
        images.pop_back();
        labels.pop_back();
        // 下面几行创建了一个特征脸模型用于人脸识别,
        // 通过CSV文件读取的图像和标签训练它。
        // T这里是一个完整的PCA变换
        //如果你只想保留10个主成分,使用如下代码
        //      cv::createEigenFaceRecognizer(10);
        //
        // 如果你还希望使用置信度阈值来初始化,使用以下语句:
        //      cv::createEigenFaceRecognizer(10, 123.0);
        //
        // 如果你使用所有特征并且使用一个阈值,使用以下语句:
        //      cv::createEigenFaceRecognizer(0, 123.0);
    
        Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
        model->train(images, labels);
        model->save("MyFacePCAModel.xml");
    
        Ptr<FaceRecognizer> model1 = createFisherFaceRecognizer();
        model1->train(images, labels);
        model1->save("MyFaceFisherModel.xml");
    
        Ptr<FaceRecognizer> model2 = createLBPHFaceRecognizer();
        model2->train(images, labels);
        model2->save("MyFaceLBPHModel.xml");
    
    
        // 下面对测试图像进行预测,predictedLabel是预测标签结果
        int predictedLabel = model->predict(testSample);
        int predictedLabel1 = model1->predict(testSample);
        int predictedLabel2 = model2->predict(testSample);
    
        // 还有一种调用方式,可以获取结果同时得到阈值:
        //      int predictedLabel = -1;
        //      double confidence = 0.0;
        //      model->predict(testSample, predictedLabel, confidence);
    
        string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
        string result_message1 = format("Predicted class = %d / Actual class = %d.", predictedLabel1, testLabel);
        string result_message2 = format("Predicted class = %d / Actual class = %d.", predictedLabel2, testLabel);
        cout << result_message << endl;
        cout << result_message1 << endl;
        cout << result_message2 << endl;
    
    
        return a.exec();
    }
    

     

    图像识别实例

    #include <QApplication>
    
    #include "opencv2/opencv.hpp"
    
    using namespace cv;
    using namespace std;
    
    
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
    
        //VideoCapture cap(0);    //打开默认摄像头
    //    if (!cap.isOpened())
    //    {
    //        return -1;
    //    }
        Mat frame;
        Mat edges;
        Mat gray;
    
        CascadeClassifier cascade;
        bool stop = false;
        //训练好的文件名称,放置在可执行文件同目录下
        cascade.load("../haarcascade_frontalface_alt.xml");
    
        Ptr<FaceRecognizer> modelPCA = createEigenFaceRecognizer();
        modelPCA->load("../MyFacePCAModel.xml");
    
        //while (!stop)
        {
            //cap >> frame;
            frame = imread("../imgs/5.jpg");
    
    
            //建立用于存放人脸的向量容器
            vector<Rect> faces(0);
    
            cvtColor(frame, gray, CV_BGR2GRAY);
            //改变图像大小,使用双线性差值
            //resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);
            //变换后的图像进行直方图均值化处理
            equalizeHist(gray, gray);
    
            cascade.detectMultiScale(gray, faces,
                                     1.1, 2, 0
                                     //|CV_HAAR_FIND_BIGGEST_OBJECT
                                     //|CV_HAAR_DO_ROUGH_SEARCH
                                     | CV_HAAR_SCALE_IMAGE,
                                     Size(50, 50));
    
            Mat face;
            Point text_lb;
    
            for (size_t i = 0; i < faces.size(); i++)
            {
                if (faces[i].height > 0 && faces[i].width > 0)
                {
                    face = gray(faces[i]);
                    text_lb = Point(faces[i].x, faces[i].y);
    
                    rectangle(frame, faces[i], Scalar(255, 0, 0), 1, 8, 0);
                }
            }
    
            Mat face_test;
    
            int predictPCA = 0;
            if (face.rows >= 120)
            {
                resize(face, face_test, Size(92, 112));
    
            }
            //Mat face_test_gray;
            //cvtColor(face_test, face_test_gray, CV_BGR2GRAY);
    
            if (!face_test.empty())
            {
                //测试图像应该是灰度图
                predictPCA = modelPCA->predict(face_test);
            }
    
            cout << predictPCA << endl;
            if (predictPCA == 29)
            {
                string name = "YangMi";
                putText(frame, name, text_lb, FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255));
            }
    
            imshow("face", frame);
    
    
            return a.exec();
        }
    }
    

     

    展开全文
  • Python-OpenCV图像识别学习

    千次阅读 2019-05-20 20:38:36
    代码已托管GitHub,仓库地址:OpenCV3-note,以下为仓库的README.md,介绍仓库信息及代码结构: OpenCV OpenCV的全称是Open Source Computer Vision Library,是一个跨...OpenCV可用于开发实时的图像处理、计算机...

    代码已托管GitHub,仓库地址:OpenCV3-note以下为仓库的README.md,介绍仓库信息及代码结构:


    OpenCV

    OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。
    OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。

    OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。


    Demo环境

    cv:4.0.0
    numpy:1.16.2
    python:3.6.1 (v3.6.1:69c0db5, 3212017, 17:54:52) [MSC v.1900 32 bit (Intel)]
    

    代码及笔记结构

    • chapter1
      • Python-OpenCV的虚拟环境安装测试、Github的命令操作等准备工作
    • chapter2
      • OpenCV图像的处理操作:获取图像信息(通道、大小等)、图像倒置(利用循环、利用numpy)、摄像头操作,同样可以运用于视频等。
      • 色彩空间:色彩空间的转换、学会使用inRange、通道分离合并。
      • 图像像素运算:加减乘除、与或非、均值方差、对比度亮度等操作。
    • chapter3
      • ROI(Region of onterest) 和 泛洪填充:图像的矩形提取、泛洪填充demo、二值图像填充。
      • 图像模糊操作:均值模糊(随机噪声)、中值模糊(椒盐噪声)、自定义模糊。
      • 高斯模糊:比均值模糊去噪效果更好,对高斯噪声效果较好。
    • chapter4
      • 图像的直方图:直方图的均衡化、直方图的比较(巴氏距离、直方图相关性、卡方)。
      • 直方图反向投影。
      • 图像二值化:OTSU、Triangle(单波峰)、局部域值、自定义域值、超大图像二值化(分块、全局域值 局部域值)。
      • 模板匹配:应用范围比较小,可能会受光线、噪声的影响,多种匹配方法:TM_SQDIFF_NORMED、TM_CCORR_NORMED、TM_CCOEFF_NORMED。
    • chapter5
      • 图像金字塔:reduce 降采样、expand 扩大。
      • 图像梯度:一阶导数和Sobel算子、Scharr算子;二阶倒数和Laplacian算子、自定义拉普拉斯算子。
      • 图像边缘提取:Canny边缘检测算法(对噪声敏感,所以先使用GaussianBlur除噪)。
    • chapter6
      • 直线检测(霍夫直线检测):HoughLines(直接划出直线)、HoughLinesP(自定义参数划出线段)。
      • 圆检测:霍夫园检测(对噪声敏感,所以需要去噪,如果不进行均值迁徙去噪,结果误差极大)。
      • 轮廓发现:1.去噪,2.灰度图像,3.二值图像,4.findContours发现轮廓,5.drawContours描绘轮廓,6.计算出轮廓,就可以进行轮廓的分析,如面积周长等。
      • 图像测量:图像中心点、图像面积测量、图像线段逼近(根据逼近的线段数得出图像形状)。
    • chapter7
      • 图像膨胀和腐蚀:彩色和灰度图像、单通道和多通道都支持。
      • 开闭操作:开操作(先腐蚀再膨胀,主要作用:去噪点,去掉小的干扰块)、闭操作(先膨胀再腐蚀,主要作用:填充小的封闭区域)。其他作用:水平或垂直直线提取、干扰线的去除。
      • 其他形态学操作:顶帽 tophat:原图像与开操作之间的差值图像、黑帽 blackhat:闭操作与原图像的差值图像、其他形态学操作 Gradient(梯度)。
      • 基于距离变换的分水岭算法流程:运用于图像分割。
    • chapter8
      • 基于级联检测器的人脸识别(haarcascade_frontalface_alt_tree.xml):需要光线较强的情况下才能比较准确。
      • 基于OpenCV+Tesserct-OCR的数字验证码识别:OpenCV预处理、Tesserct-OCR验证码识别。

    有问题反馈

    在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

    展开全文
  • Android OpenCV图像识别和图像追踪

    万次阅读 2016-12-14 17:14:45
    首先介绍一下OpenCV图像识别和跟踪机制:  图像跟踪机制是确定矩目标在3D环境中的姿态,并根据此类信息环绕目标对象绘制轮廓线。在最终的2D图像中,考虑到目标可能相对于相机倾斜,因而轮廓线将呈现为四边形(不...
    首先介绍一下OpenCV中图像识别和跟踪机制:
    
           图像跟踪机制是确定矩目标在3D环境中的姿态,并根据此类信息环绕目标对象绘制轮廓线。在最终的2D图像中,考虑到目标可能相对于相机倾斜,因而轮廓线将呈现为四边形(不一定是矩形)。
           上述跟踪机制主要包含以下四个步骤:
           (1)获取目标特征。这里特征是指从不同的距离或角度进行观察室,维持特征的外观的一点。例如,各角通常具备此类特征。
           (2)针对各特征集获取描述符,此处,描述符表示为与特征相关的数据向量。需要注意的是,某些特征并不适合生成描述符,因此与特征相比,图像包含较少的描述符。
           (3)获取两个描述符集合间的匹配项。若假设将描述符视为多维空间的数据点,则匹配结果将根据点间的距离加以定义。其中,彼此接近的描述符视为匹配。
           (4)获取参考图像和空间匹配图像间的单应性(homography)。这里,单应性是指一类3D转换,并可排列两幅投影后的2D图像(或足够接近以对二者进行排列)。该过程根据两幅图像的匹配特征点进行计算。当对矩形采用但应性时,即可获得跟踪图像的轮廓线。
            关于本文中相机缓冲和Filter的使用请参考:
     Android OpenCV获取相机并拍(Android Studio)
        言归正传,下面介绍图像检测的ImageDetectionFilter,先上构造方法:
    public ImageDetectionFilter(Context context, int referenceImageResourceID) throws IOException {

    // Load the reference image from the app's resources.
    // It is loaded in BGR (blue, green, red) format.
    mReferenceImage = Utils.loadResource(context, referenceImageResourceID, Imgcodecs.CV_LOAD_IMAGE_COLOR);

    // Create grayscale and RGBA versions of the reference image.
    Mat referenceImageGray = new Mat();
    Imgproc.cvtColor(mReferenceImage, referenceImageGray, Imgproc.COLOR_BGR2GRAY);
    Imgproc.cvtColor(mReferenceImage, mReferenceImage, Imgproc.COLOR_BGR2RGBA);

    // Store the reference image's corner coordinates, in pixels.
    mReferenceCorners.put(0, 0, new double[]{0.0, 0.0});
    mReferenceCorners.put(1, 0, new double[]{referenceImageGray.cols(), 0.0});
    mReferenceCorners.put(2, 0, new double[]{referenceImageGray.cols(), referenceImageGray.rows()});
    mReferenceCorners.put(3, 0, new double[]{0.0, referenceImageGray.rows()});

    // Detect the reference features and compute their
    // descriptors.
    mFeatureDetector.detect(referenceImageGray, mReferenceKeypoints);
    mDescriptorExtractor.compute(referenceImageGray, mReferenceKeypoints, mReferenceDescriptors);
    }
           代码中首先根据传入的参考图像资源生成Mat对象,然后生成灰度图和RGBA存储在成员变量中,另外,将图像的角点,特征以及描述符也一并存储。

            初始化完成以后,接下来就是apply方法,该方法在获取每一帧时都会被调用,进行图像检测,代码如下:
    @Override
    public void apply(Mat src, Mat dst) {

    // Convert the scene to grayscale.
    Imgproc.cvtColor(src, mGraySrc, Imgproc.COLOR_RGBA2GRAY);

    // Detect the scene features, compute their descriptors,
    // and match the scene descriptors to reference descriptors.
    mFeatureDetector.detect(mGraySrc, mSceneKeypoints);
    mDescriptorExtractor.compute(mGraySrc, mSceneKeypoints, mSceneDescriptors);
    mDescriptorMatcher.match(mSceneDescriptors, mReferenceDescriptors, mMatches);

    // Attempt to find the target image's corners in the scene.
    findSceneCorners();

    // If the corners have been found, draw an outline around the
    // target image.
    // Else, draw a thumbnail of the target image.
    draw(src, dst);
    }
            在该方法中,首先向获取到的图像取灰度图,接着讲灰度图进行特征检测,描述符检测以及描述符匹配。随后,调用findSceneCorners方法获取跟踪目标的四个角(若存在的话),并绘制四边形轮廓。最后调用draw()方法,在左上角绘制目标图像的缩略图。

    项目Github地址:https://github.com/BruceT2010/OpenCV4AndroidSecondSight
            
    展开全文
  • OpenCV图像识别初探-50行代码教机器玩2D游戏

    千次阅读 多人点赞 2019-07-01 11:33:46
    本文简要介绍如何通过OpenCV实现简单的图像识别,并让计算机通过“视觉”自动玩一个简单的2D小游戏,文末有视频演示及完整代码。 0x01 OpenCV介绍 Open Source Computer Vision Library.OpenCV于1999年由Intel...

    最近在研究OpenCV,希望能通过机器视觉解决一些网络安全领域的问题。本文简要介绍如何通过OpenCV实现简单的图像识别,并让计算机通过“视觉”自动玩一个简单的2D小游戏,文末有视频演示及完整代码。

     

    0x01 OpenCV介绍

    Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作系统上。它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是3.1 ,2016年1月29日发布。(引自百度百科openCV)   

    简言之,通过openCV可实现计算机图像、视频的编辑。广泛应用于图像识别、运动跟踪、机器视觉等领域。

    0x02 环境

    • Win7 或Win10操作系统

    • Python 3.5 以上

    0x03 安装

    • pip install --upgrade setuptools

    • pip install numpy Matplotlib

    • pip install opencv-python

    • pip install pyautogui

    • pip install mss

    • pip install pynput

    0x04 代码说明

    这个网站提供一个简单的2D小游戏,越过障碍获得分数,我们希望让计算机模拟人的行为控制小恐龙跳过地面上不断出现的树木,整个程序可以被分成三个阶段,即屏幕监控(看) > 障碍物识别(识别) > 键盘控制(控制)。

    屏幕监控

    我们使用python mss对屏幕的指定区域进行监控,其实就是不断截图并对一帧一帧的图片进行分析。 这里monitor变量保存的是屏幕监控的区域

    with mss.mss() as sct:
        # Part of the screen to capture
       ** = {'top': 280, 'left': 100, 'width': 660, 'height': 300}
        while 'Screen capturing':
            # Get raw pixels from the screen, save it to a Numpy array
            img = numpy.array(sct.grab(monitor))

    图像识别

    上一步我们通过监控屏幕上的指定区域可以获取到一帧一帧的图片,我们的目的是识别屏幕上出现的障碍物,以及障碍物的相对位置,这里主要是用OpenCV的matchTemplate方法在目标截图中查找已知的图像元素,所以我们要先截取一些障碍物的图片,如下图所示:

    然后在目标图像中查找,这里我们设定图片比对的相似度阈值为65%,这样相当于是做模糊匹配,虽然可能会降低识别精准度,但可以少准备几个截图

    res2 = cv2.matchTemplate(img_gray, tree1, cv2.TM_CCOEFF_NORMED)
    threshold = 0.65
    loc2 = numpy.where(res2 >= threshold)

    识别到相应的障碍物以后我们希望在物体周围画一个矩形框,这样方便调试和查看效果

    for pt in zip(*loc2[::-1]):
    cv2.rectangle(img, pt, (pt[0] + tw, pt[1] + th), (0, 0, 255), 2)

    鼠标及键盘控制

    识别到屏幕上的障碍物以后,我们要控制鼠标和键盘做出相应的操作,这里我们使用pyautoguipynput实现鼠标键盘的模拟

    def startgame():
        pyautogui.click(web)
        time.sleep(0.03)
        pyautogui.keyDown('space')
        time.sleep(0.03)
        pyautogui.keyUp('space')
        print('game start')
    
    def jump():
        key.release(Key.down)
        key.press(Key.space)
        print('jump')
        time.sleep(0.3)
        key.release(Key.space)
        key.press(Key.down)

    效果演示

    meetingrec_0.gif

    import time
    import pyautogui
    from pynput.keyboard import Key, Controller
    import cv2
    import mss
    import numpy
    
    # use browser to visit http://www.trex-game.skipser.com/
    # put the browser to the left side and run the programme
    
    key = Controller()
    
    web = (200, 400)
    
    tree1 = cv2.imread('tree1.png', 0)
    tw, th = tree1.shape[::-1]
    
    tree4 = cv2.imread('tree4.png', 0)
    tw4, th4 = tree4.shape[::-1]
    
    birdie = cv2.imread('birdie1.png', 0)
    nw, nh = birdie.shape[::-1]
    
    
    def startgame():
        pyautogui.click(web)
        time.sleep(0.03)
        pyautogui.keyDown('space')
        time.sleep(0.03)
        pyautogui.keyUp('space')
        print('game start')
    
    
    def jump():
        key.release(Key.down)
        key.press(Key.space)
        print('jump')
        time.sleep(0.3)
        key.release(Key.space)
        key.press(Key.down)
    
    
    startgame()
    
    with mss.mss() as sct:
        # Part of the screen to capture
    
        monitor = {'top': 280, 'left': 100, 'width': 660, 'height': 300}
    
        while 'Screen capturing':
            key.press(Key.down)
            # Get raw pixels from the screen, save it to a Numpy array
            img = numpy.array(sct.grab(monitor))
    
            img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
            res2 = cv2.matchTemplate(img_gray, tree1, cv2.TM_CCOEFF_NORMED)
            res5 = cv2.matchTemplate(img_gray, tree4, cv2.TM_CCOEFF_NORMED)
            res3 = cv2.matchTemplate(img_gray, birdie, cv2.TM_CCOEFF_NORMED)
    
            threshold = 0.65
    
            loc2 = numpy.where(res2 >= threshold)
            for pt in zip(*loc2[::-1]):
                cv2.rectangle(img, pt, (pt[0] + tw, pt[1] + th), (0, 0, 255), 2)
                if pt[0] + tw < 280:
                    jump()
                    break
    
            loc2 = numpy.where(res3 >= threshold)
            for pt in zip(*loc2[::-1]):
                cv2.rectangle(img, pt, (pt[0] + nw, pt[1] + nh), (0, 0, 255), 2)
                print("{0},{1}".format(pt[0], pt[1]))
                if pt[1] + nh > 280 and pt[0] + nw < 420:
                    jump()
                    break
    
            loc5 = numpy.where(res5 >= threshold)
            for pt in zip(*loc5[::-1]):
                cv2.rectangle(img, pt, (pt[0] + tw4, pt[1] + th4), (0, 0, 255), 2)
                if pt[0] + tw4 < 280:
                    jump()
                    break
    
            # Display the picture
            cv2.imshow('OpenCV/Numpy normal', img)
    
            # Press "q" to quit
            if cv2.waitKey(25) & 0xFF == ord('q'):
                cv2.destroyAllWindows()
                break

     来源:华为云社区  作者:菊花茶

    展开全文
  • opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; enum DiColor{...
  • cv2:python的图像识别软件,据说功能非常强大,注意下载这个包的时候,不要搜索cv2,这个是没有的,应该搜索opencv-python,然后直接 import cv2 就可以了。 numpy :没啥说的,直接下载,强大的矩阵处理工具。 ...
  • opencv图像识别人脸模型库

    千次阅读 2018-10-18 22:52:23
    opencv/data/haarcascades/haarcascade_frontalface_alt.xml
  • 树莓派自带摄像头OpenCV图像识别-二维码识别

    万次阅读 热门讨论 2017-12-23 10:37:57
    5、我们进入正题 二维码识别,我这里我们还需要装一个Python-zbar 输入命令 sudo apt-get install python-zbar 完成后直接使用下面程序运行 #!/usr/bin/env python #-*- coding: UTF-8 -*- # import ...
  • python+opencv图像识别教程整理

    千次阅读 2018-10-17 18:01:57
    0.opencv-python教程及API(英文) ... 1.图像身份识别 一个印度小伙写的 一手记事本开发 甚吊 https://thecodacus.com/category/opencv/page/2/#.W8b6nc4zaUk 2.圆形检测和满...
  • 可以说识别任意的物品,前提是需要训练模型 使用opencv 训练http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html 正样本:包含特征(苹果)的图片,灰度图。 正样本大小:统一大小...
  • Opencv图像识别常用的处理算法

    千次阅读 2019-12-26 09:16:16
    # OpenCV图片转换为PIL image def CVImageToPIL(image): return Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB)) 图片锐化处理 def custom_blur_demo(image): kernel = np.array([[0, -1, 0], [-1, ...
  • OpenCV图像识别:车牌定位算法源码,Python语言实现

    万次阅读 多人点赞 2018-03-04 13:17:56
    # 使用颜色识别判断找出最像车牌的区域 maxweight, maxinedx = 0, -1 for i in xrange(len(blocks)): b = orgimg[blocks[i][0][1]:blocks[i][0][3], blocks[i][0][0]:blocks[i][0][2]] # RGB转HSV hsv = cv...
  • 本人在做一个图像方面的相对位置测量,图像上有两条线段,但是很粗,如何得到两条线段的端点呢,目前使用霍夫变换,但是得到的线段太多,没法使用,请图像方面的指导还有没有什么方法可以使用,谢谢了
  • 一、ROS中的图像数据 显示图像类型: roslaunch usb_cam usb_cam-test.launch rostopic info /usb_cam/image_raw 查看图像消息: rosmsg show sensor_msgs/Image Header:消息头,包含消息序列,时间戳和绑定坐标...
  • 目录 项目描述 基本功能 业务流程 相关参数 技术选型 代码实现 项目描述 ...传统纸质化的试卷批改费时费力 ...使用Word自动化制作题卡(题卡合一,独立答题卡),生成分数格以及识别点,同时生成扫描用...
  • 最近在弄卷积神经网络的学习,里面涉及到用opencv来获取图像,这是第一次接触opencv,和大家一起分享学习。   # -*- coding: utf-8 -* import cv2 #img=cv2.imread('timg.jpeg',cv2.IMREAD_COLOR) img=cv2....
  • 在实际应用中,无论是web端还是移动端,仍有很多时候需要根据页面内容、页面中的图像进行定位及判定,这里介绍一下基于opencv图像识别技术在自动化测试中的应用。 这里我们使用selenium驱动测试,使用opencv进行...
  • Appium+Opencv java环境创建看了一篇关于手机图像识别在手机自动化中的应用的文章,很敢兴趣,所以进行了摸索尝试。这里记录环境的搭建。涉及工具 Appium genymotion virtualbox Android sdk IntelliJ 环境搭建 ...
  • 不过下载过程中你可以多做点其他事情嘛~ [1] 【博客园】树莓派(raspberry pi)] 02、PI3安装openCV开发环境做图像识别(详细版) [2] 【英文教程】在Raspberry Pi上安装OpenCV 4 [3] 【简书】子豪兄教你在树莓派上...
  • 其实,对于图像显示,对于我们在安装调试opencv的时候,就是作为一个例子,相信看到第三节的话,应该有了正确的配置环境,还有就是对opencv的结构有了一定的理解,那么下面就是进去图像处理的阶段,但是为了更好的...
  • Opencv图像识别从零到精通(2)-----准备知识

    万次阅读 多人点赞 2016-07-11 11:03:56
    首先你安装好了,然后用一个测试文件(没有测试文件可以找后面教程中的图像显示的代码粘贴... 在这个文件下D:\ProgramFiles\opencv\build\include\opencv2会看到很多东西,这些都是需要的模块,里面有很多的要用的东西
  • SIFT在前面已经说过了,可以说在实现过程中是精益求精,用了各种手段来删除不符合条件的特征点,同时也得到了很好的效果但是实时性...图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流
  • 在win把opencv3.2.0及opencv_contrib 3.2.0解压,把opencv_contrib 3.2.0复制在opencv3.2.0文件夹里,用U盘复制提取到home目录下。 下载链接: https://sourceforge.net/projects/aruco/files/ 下载aruco原码,...
  • 不得不说,opencv的安装需要很久,也会出现很多的错误,也是参考了很多的安装教程,最后显示图像的时候,还是很开心的。先来 1.下载和安装OpenCV SDK VS2010是默认已经安装的,因为没有什么技巧,这里就不说了。...
  • 一 KNN简介  K最近邻(k-Nearest Neighbor,KNN)分类算法,该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征...图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流
  • 根据vc6.0c++的学习经验,如果可以...看着很简单的变换,可以对图像处理上手的更快,当然对于旋转可能就稍微i难了一点,不过opencv提供了resize(0,remap()等这样的函数,可以方便的让我们进行学习,特别是旋转的时候,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,588
精华内容 18,635
关键字:

opencv图像识别