基于树莓派qt和raspicam开发的红球识别程序

微信截图_20201023104152.png


本例程在树莓派4上运行成功,基于arm-gcc-gnueabihf-8 。
1 首先在树莓派编译opencv 3.2.0 并 sudo make install
2 使用cmake 编译raspicam  ,确保raspicam支持cv模块。
3 安装qt5-default 和qtcreator 
4 运行qt-raspicam 



#include "cameraworker.h"

#include <fstream>
#include <iostream>

#include <QDebug>
#include <QApplication>

#include "unistd.h"
#include <iostream>
#include <stdio.h>

#include <raspicam/raspicam_cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

CameraWorker::CameraWorker() : cameraRunning(true)
{
    qRegisterMetaType<QImage>("QImage&");
    data = new unsigned char[camera.getImageTypeSize(RASPICAM_FORMAT_RGB)];
}

CameraWorker::~CameraWorker()
{
}

int  CameraWorker::Hough_circle_track(Mat image)
{
    Mat srcImage,  dstImage;
    Mat channel[3];
    //cmd &0x01 ==0x00?‰? cmd&0x01 =0x01??????cmd&0x02== cmd&0x02=
    //cmd & 0x10 ==0x10  valid ;cmd &0x10 =0x00,invalid
    //cmd &0x20 ==0x20  valid ;cmd &0x20 =0x00,invalid
    char cmd = 1;

    int g_nHm = 9;
    image.copyTo(srcImage);
    split(image, channel);
    channel[0] = channel[0].mul(.1*g_nHm); // B    (mul: per-element matrix multiplication)
    channel[1] = channel[1].mul(.1*g_nHm); // G
    channel[2] = channel[2] - channel[0] - channel[1]; // R
    channel[2] = 3 * channel[2];

    dstImage = channel[2];
    GaussianBlur(dstImage, dstImage, Size(9, 9), 2, 2);

    vector<Vec3f> circles; //
    HoughCircles(dstImage, circles, CV_HOUGH_GRADIENT, 1, image.rows / 5, 200, 16, 50, 100);

    for (size_t i = 0; i < circles.size(); i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);

        circle(image, center, 3, Scalar(0, 255, 0), -1, 8, 0);
        circle(image, center, radius, Scalar(155, 50, 255), 3, 8, 0);

        printf("current circles position :" );
        cout << circles[i][0] << "\t" << circles[i][1] << "\t" << circles[i][2] << endl;

    }

   return cmd;

}
void CameraWorker::doWork()
{
    // Open the camera
    cv_camera.set( CV_CAP_PROP_CONVERT_RGB, CV_8UC1 );

    if (!cv_camera.open()) {
        qDebug() << "Error opening camera";
        cameraRunning = false;
    } else {
        cameraRunning = true;
    }
   // camera.setFormat(RASPICAM_FORMAT_BGR);
    // Wait for the camera
    sleep(1);
    Mat image;
    Mat rgbimage;

    // While the camera is on (the user has clicked the button), capture
    while (cameraRunning) {
        // Capture
        cv_camera.grab();
        cv_camera.retrieve(image);
     //    cv::imwrite("raspicam_cv_image.png",image);
        // Convert the data and send to the caller to handle

       // cv::resize(image,image,Size(320,240), 0.0,0.0,INTER_LINEAR);
       if( Hough_circle_track(image) > 0 ){
        cv::cvtColor(image,rgbimage,COLOR_BGR2RGB);
   //     qDebug() << "width is" << image.cols << "height is" << image.rows;
        QImage img = QImage(rgbimage.data, rgbimage.cols, rgbimage.rows, QImage::Format_RGB888);
        emit handleImage(img);
       }

        // Make the app process stopWork() if necessary
        qApp->processEvents();
        usleep(200);

    }
    cv_camera.release();
}

void CameraWorker::stopWork()
{
    // Set the flag to false
    cameraRunning = false;

    emit finished();
}


[lv]链接:https://pan.baidu.com/s/14M-mx8k84-D9VQhyPpWrfA  提取码:1lba  复制这段内容后打开百度网盘手机App,操作更方便哦 [/lv]


sitemap