首页 > 解决方案 > 每次我运行此代码时,我的 Raspberry-pi 3b+ 都会重新启动

问题描述

所以我正在做一个项目,让机器人汽车识别停车标志和一些物体,并据此采取行动。

现在,每当我运行此代码时,它都会打开相机,然后我立即失去与 VNC 查看器的连接。

我使用 5 伏、3 安输出移动电源。

当我运行代码打开相机时没有问题,但只有下面的代码。

#include <opencv2/opencv.hpp>
#include <raspicam_cv.h>
#include <iostream>
#include <chrono>
#include <ctime>
#include <wiringPi.h>

using namespace std;
using namespace cv;
using namespace raspicam;

// Image Processing variables
Mat frame, Matrix, framePers, frameGray, frameThresh, frameEdge, frameFinal, frameFinalDuplicate, frameFinalDuplicate1;
Mat ROILane, ROILaneEnd;
int LeftLanePos, RightLanePos, frameCenter, laneCenter, Result, laneEnd;

RaspiCam_Cv Camera;

stringstream ss;


vector<int> histrogramLane;
vector<int> histrogramLaneEnd;

Point2f Source[] = {Point2f(40,135),Point2f(310,135),Point2f(10,185), Point2f(330,185)};
Point2f Destination[] = {Point2f(100,0),Point2f(280,0),Point2f(100,240), Point2f(280,240)};


//Machine Learning variables
CascadeClassifier Stop_Cascade;
Mat frame_stop;
Mat frame_Stop, RoI_Stop, gray_Stop;
vector<Rect> Stop;
int dist_Stop;

 void Setup ( int argc,char **argv, RaspiCam_Cv &Camera )
  {
    Camera.set ( CAP_PROP_FRAME_WIDTH,  ( "-w",argc,argv,400 ) );
    Camera.set ( CAP_PROP_FRAME_HEIGHT,  ( "-h",argc,argv,240 ) );
    Camera.set ( CAP_PROP_BRIGHTNESS, ( "-br",argc,argv,60) );
    Camera.set ( CAP_PROP_CONTRAST ,( "-co",argc,argv,70 ) );
    Camera.set ( CAP_PROP_SATURATION,  ( "-sa",argc,argv,50 ) );
    Camera.set ( CAP_PROP_GAIN,  ( "-g",argc,argv ,50) );
    Camera.set ( CAP_PROP_FPS,  ( "-fps",argc,argv,0));

}

void Capture()
{
    Camera.grab();
    Camera.retrieve( frame);
    cvtColor(frame, frame, COLOR_BGR2RGB);
   cvtColor(frame, frame_Stop, COLOR_BGR2RGB);
    
    
}

void Perspective()
{
    line(frame,Source[0], Source[1], Scalar(0,0,255), 2);
    line(frame,Source[1], Source[3], Scalar(0,0,255), 2);
    line(frame,Source[3], Source[2], Scalar(0,0,255), 2);
    line(frame,Source[2], Source[0], Scalar(0,0,255), 2);
    
    
    Matrix = getPerspectiveTransform(Source, Destination);
    warpPerspective(frame, framePers, Matrix, Size(400,240));
}

void Threshold()
{
    cvtColor(framePers, frameGray, COLOR_RGB2GRAY);
    inRange(frameGray, 240, 255, frameThresh);
    Canny(frameGray,frameEdge, 900, 900, 3, false);
    add(frameThresh, frameEdge, frameFinal);
    cvtColor(frameFinal, frameFinal, COLOR_GRAY2RGB);
    cvtColor(frameFinal, frameFinalDuplicate, COLOR_RGB2BGR);   //used in histrogram function only
    cvtColor(frameFinal, frameFinalDuplicate1, COLOR_RGB2BGR);   //used in histrogram function only
    
}

void Histrogram()
{
    histrogramLane.resize(400);
    histrogramLane.clear();
    
    for(int i=0; i<400; i++)       //frame.size().width = 400
    {
    ROILane = frameFinalDuplicate(Rect(i,140,1,100));
    divide(255, ROILane, ROILane);
    histrogramLane.push_back((int)(sum(ROILane)[0])); 
    }
    
    histrogramLaneEnd.resize(400);
    histrogramLaneEnd.clear();
    for (int i = 0; i < 400; i++)       
    {
        ROILaneEnd = frameFinalDuplicate1(Rect(i, 0, 1, 240));   
        divide(255, ROILaneEnd, ROILaneEnd);       
        histrogramLaneEnd.push_back((int)(sum(ROILaneEnd)[0]));  
        
    
    }
       laneEnd = sum(histrogramLaneEnd)[0];
       cout<<"Lane END = "<<laneEnd<<endl;
}

void LaneFinder()
{
    vector<int>:: iterator LeftPtr;
    LeftPtr = max_element(histrogramLane.begin(), histrogramLane.begin() + 150);
    LeftLanePos = distance(histrogramLane.begin(), LeftPtr); 
    
    vector<int>:: iterator RightPtr;
    RightPtr = max_element(histrogramLane.begin() +250, histrogramLane.end());
    RightLanePos = distance(histrogramLane.begin(), RightPtr);
    
    line(frameFinal, Point2f(LeftLanePos, 0), Point2f(LeftLanePos, 240), Scalar(0, 255,0), 2);
    line(frameFinal, Point2f(RightLanePos, 0), Point2f(RightLanePos, 240), Scalar(0,255,0), 2); 
}

void LaneCenter()
{
    laneCenter = (RightLanePos-LeftLanePos)/2 +LeftLanePos;
    frameCenter = 188;
    
    line(frameFinal, Point2f(laneCenter,0), Point2f(laneCenter,240), Scalar(0,255,0), 3);
    line(frameFinal, Point2f(frameCenter,0), Point2f(frameCenter,240), Scalar(255,0,0), 3);

    Result = laneCenter-frameCenter;
}

void Stop_detection()
{
    if(!Stop_Cascade.load("//home//pi/Desktop//MACHINE LEARNING//Stop_cascade.xml"))
    {
    printf("Unable to open stop cascade file");
    }
    RoI_Stop = frame_Stop(Rect(0,0,400,240));
    cvtColor(RoI_Stop, gray_Stop, COLOR_RGB2GRAY);
    equalizeHist(gray_Stop, gray_Stop);
    Stop_Cascade.detectMultiScale(gray_Stop, Stop);
    
    for(int i=0; i<Stop.size(); i++)
    {
    Point P1(Stop[i].x, Stop[i].y);
    Point P2(Stop[i].x + Stop[i].width, Stop[i].x + Stop[i].height);
    
    rectangle(RoI_Stop, P1, P2, Scalar(0, 0, 255), 2);
    putText(RoI_Stop, "Stop Sign", P1, FONT_HERSHEY_PLAIN, 1,  Scalar(0, 0, 255, 255), 2);
    dist_Stop = (-0.91)*(P2.x-P1.x) + 102.597;

       ss.str(" ");
       ss.clear();
       ss<<"D = "<<dist_Stop<<"cm";
       putText(RoI_Stop, ss.str(), Point2f(1,130), 0,1, Scalar(0,0,255), 2);
    }
}

int main(int argc,char **argv)
{
    
    wiringPiSetup();
    pinMode(21, OUTPUT);
    pinMode(22, OUTPUT);
    pinMode(23, OUTPUT);
    pinMode(24, OUTPUT);
    
    Setup(argc, argv, Camera);
    cout<<"Connecting to camera"<<endl;
    if (!Camera.open())
    {
        
    cout<<"Failed to Connect"<<endl;
    }
     
    cout<<"Camera Id = "<<Camera.getId()<<endl;
     
 
    while(1)
    {
    
    auto start = std::chrono::system_clock::now();

    Capture();
    Perspective();
    Threshold();
    Histrogram();
    LaneFinder();
    LaneCenter();
    Stop_detection();
    
    if (laneEnd > 6000)
    {
        digitalWrite(21, 1);
    digitalWrite(22, 1);    //decimal = 7
    digitalWrite(23, 1);
    digitalWrite(24, 0);
    cout<<"Lane End"<<endl;
    }
    
    
    if (Result == 0)
    {
    digitalWrite(21, 0);
    digitalWrite(22, 0);    //decimal = 0
    digitalWrite(23, 0);
    digitalWrite(24, 0);
    cout<<"Forward"<<endl;
    }
    
        
    else if (Result >0 && Result <10)
    {
    digitalWrite(21, 1);
    digitalWrite(22, 0);    //decimal = 1
    digitalWrite(23, 0);
    digitalWrite(24, 0);
    cout<<"Right1"<<endl;
    }
    
        else if (Result >=10 && Result <20)
    {
    digitalWrite(21, 0);
    digitalWrite(22, 1);    //decimal = 2
    digitalWrite(23, 0);
    digitalWrite(24, 0);
    cout<<"Right2"<<endl;
    }
    
        else if (Result >20)
    {
    digitalWrite(21, 1);
    digitalWrite(22, 1);    //decimal = 3
    digitalWrite(23, 0);
    digitalWrite(24, 0);
    cout<<"Right3"<<endl;
    }
    
        else if (Result <0 && Result >-10)
    {
    digitalWrite(21, 0);
    digitalWrite(22, 0);    //decimal = 4
    digitalWrite(23, 1);
    digitalWrite(24, 0);
    cout<<"Left1"<<endl;
    }
    
        else if (Result <=-10 && Result >-20)
    {
    digitalWrite(21, 1);
    digitalWrite(22, 0);    //decimal = 5
    digitalWrite(23, 1);
    digitalWrite(24, 0);
    cout<<"Left2"<<endl;
    }
    
        else if (Result <-20)
    {
    digitalWrite(21, 0);
    digitalWrite(22, 1);    //decimal = 6
    digitalWrite(23, 1);
    digitalWrite(24, 0);
    cout<<"Left3"<<endl;
    }
    
    
   if (laneEnd > 6000)
    {
       ss.str(" ");
       ss.clear();
       ss<<" Lane End";
       putText(frame, ss.str(), Point2f(1,50), 0,1, Scalar(255,0,0), 2);
    
     }
    
    else if (Result == 0)
    {
       ss.str(" ");
       ss.clear();
       ss<<"Result = "<<Result<<" Move Forward";
       putText(frame, ss.str(), Point2f(1,50), 0,1, Scalar(0,0,255), 2);
    
     }
    
    else if (Result > 0)
    {
       ss.str(" ");
       ss.clear();
       ss<<"Result = "<<Result<<" Move Right";
       putText(frame, ss.str(), Point2f(1,50), 0,1, Scalar(0,0,255), 2);
    
     }
     
     else if (Result < 0)
    {
       ss.str(" ");
       ss.clear();
       ss<<"Result = "<<Result<<" Move Left";
       putText(frame, ss.str(), Point2f(1,50), 0,1, Scalar(0,0,255), 2);
    
     }
    
    
    namedWindow("orignal", WINDOW_KEEPRATIO);
    moveWindow("orignal", 0, 100);
    resizeWindow("orignal", 640, 480);
    imshow("orignal", frame);
    
    namedWindow("Perspective", WINDOW_KEEPRATIO);
    moveWindow("Perspective", 640, 100);
    resizeWindow("Perspective", 640, 480);
    imshow("Perspective", framePers);
    
    namedWindow("Final", WINDOW_KEEPRATIO);
    moveWindow("Final", 1280, 100);
    resizeWindow("Final", 640, 480);
    imshow("Final", frameFinal);
    
    namedWindow("Stop Sign", WINDOW_KEEPRATIO);
    moveWindow("Stop Sign", 1280, 580);
    resizeWindow("Stop Sign", 640, 480);
    imshow("Stop Sign", RoI_Stop);
    
    
    waitKey(1);
    auto end = std::chrono::system_clock::now();
    std::chrono::duration<double> elapsed_seconds = end-start;
    
   // float t = elapsed_seconds.count();
   // int FPS = 1/t;
   // cout<<"FPS = "<<FPS<<endl;
    
    }

    
    return 0;
     
}

标签: c++opencvmachine-learningraspberry-pi3

解决方案


推荐阅读