Skocz do zawartości

RPi + RPi Cam + OpenCV + C++


nowok

Pomocna odpowiedź

Witam serdecznie wszystkich, jest to moj pierwszy post na forum, mam nadzieje ze w dobrym miejscu.

Składając układ mobilny mający na celu wykrywanie kolorowego punktu lasera i podążania za nim, napotkał mnie problem.

Mam gotowy kod programu wykrywający barwę (na pc), i napotyka mnie problem przeniesienia kodu na rpi. Jestem początkujący, więc proszę o wyrozumiałość.


#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
   VideoCapture cap(0); 

   if ( !cap.isOpened() )  
   {
        cout << "Cannot open the web cam" << endl;
        return -1;
   }

   namedWindow("Control", CV_WINDOW_AUTOSIZE); 

 int iLowH = 170;
int iHighH = 179;

 int iLowS = 150; 
int iHighS = 255;

 int iLowV = 60;
int iHighV = 255;

createTrackbar("LowH", "Control", &iLowH, 179);
createTrackbar("HighH", "Control", &iHighH, 179);

 createTrackbar("LowS", "Control", &iLowS, 255); 
createTrackbar("HighS", "Control", &iHighS, 255);

 createTrackbar("LowV", "Control", &iLowV, 255);
createTrackbar("HighV", "Control", &iHighV, 255);

 int iLastX = -1; 
int iLastY = -1;


Mat imgTmp;
cap.read(imgTmp); 


Mat imgLines = Mat::zeros( imgTmp.size(), CV_8UC3 );;


   while (true)
   {
       Mat imgOriginal;

       bool bSuccess = cap.read(imgOriginal); 



        if (!bSuccess) //if not success, break loop
       {
            cout << "Cannot read a frame from video stream" << endl;
            break;
       }

   Mat imgHSV;

  cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); 
 Mat imgThresholded;

  inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

 erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
 dilate( imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) ); 

 dilate( imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) ); 
 erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );

 Moments oMoments = moments(imgThresholded);

  double dM01 = oMoments.m01;
 double dM10 = oMoments.m10;
 double dArea = oMoments.m00;
because of the noise, the area is not zero 
 if (dArea > 10000)
 {

  int posX = dM10 / dArea;
  int posY = dM01 / dArea;        

  if (iLastX >= 0 && iLastY >= 0 && posX >= 0 && posY >= 0)
  {

   line(imgLines, Point(posX, posY), Point(iLastX, iLastY), Scalar(0,0,255), 2);
  }

   iLastX = posX;
  iLastY = posY;
 }

  imshow("Thresholded Image", imgThresholded);

  imgOriginal = imgOriginal + imgLines;
 imshow("Original", imgOriginal); 
       if (waitKey(30) == 27) 
break loop
      {
           cout << "esc key is pressed by user" << endl;
           break; 
      }
   }

  return 0;
}

Chciałbym zapytać czy na forum znajduje się ktoś kto miał do czynienia z opencv + rpi + c++? Lub ewentualnie potrafiłby przełożyć ten kod na pythona? Mój główny problem w c++ to uruchomienie dedykowanej kamery rpi z poziomu programu.

Pozdrawiam

Link do komentarza
Share on other sites

Ja uruchamiałem OpenCV2 na RPi z wykorzystaniem Pythona. Kod do pobierania obrazu z kamery znajdziesz w przykładzie do 'facedetect'.

Jeżeli korzystasz z kamery płytkowej to przed uruchomieniem programu pamiętaj, żeby załadować moduł do jej obsługi za pomocą komendy

sudo modprobe bcm2835-v4l2
(o ile dobrze pamiętam)
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.