0

我有两个 C++ 程序。一个是与arduino(pgm1)通信,另一个是读取网络摄像头的openCV程序(pgm2)。独立地,他们以道德的速度工作。

如果我们在不同的终端同时打开它们,它们就可以完美运行。我想将它们作为一个程序加入,我尝试了一个程序(pgm3)。我可以实时完美地获取图像。但是来自 arduino 的数据延迟了大约 7-10 秒。不幸的是,我只知道 c/c++/embedded c。所以请用这些语言中的任何一种向我推荐一个解决方案

pgm1

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
char ch;
ifstream f;
f.open("/dev/ttyACM0");
while (f.get(ch)) 
{
cout<<ch;   
if(ch=='#')
cout<<endl;
}
return 0;

pgm2

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
/** Function Headers */
String window_name = "webcam c170 preview";
/** @function main */
int main( void )
{
VideoCapture capture;
Mat frame;

capture.open( 1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

while ( capture.read(frame) )
{
    if( frame.empty() )
    {
        printf(" --(!) No captured frame -- Break!");
        break;
    }

    //-- 3. show frames
    imshow( window_name, frame );
    int c = waitKey(30);
    if( (char)c == 27 ) { break; } // escape
}
return 0;
}
}

pgm3

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include<fstream>
using namespace std;
using namespace cv;
void spi_read(void);
/** Global variables */
char ch;
ifstream f;
String window_name = "webcam c170 preview";
/** @function main */
int main( void )
{
VideoCapture capture;
Mat frame;
f.open("/dev/ttyACM0");
capture.open( 1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

while ( capture.read(frame) )
{
    if( frame.empty() )
    {
        printf(" --(!) No captured frame -- Break!");
        break;
    }   
    //-- 3. show frames
    imshow( window_name, frame );
    int c = waitKey(30);
    if( (char)c == 27 ) { break; } // escape
spi_read();
}
return 0;
}
void spi_read()
{
String str_spi;
do
{
    f.get(ch);
    str_spi=str_spi+ch;
}while(ch!='#');
cout<<str_spi<<endl;

}
4

1 回答 1

0

不要只是将代码合并到一个函数中——当然它会导致你的第二个程序“延迟”——因为它在你的 previos 代码完成后开始执行。
您应该创建单独的线程来模拟您的 pgm1/pgm2 程序,然后可能在您的主线程中处理它们接收到的数据 - 取决于您的需要。
使用 boost/thread 的最直接的解决方案:

void do_what_pgm1_does() {..}  
void do_what_pgm2_does() {..}
int main()
{
  boost::thread t1(do_what_pgm1_does);  
  boost::thread t2(do_what_pgm2_does);
  t1.join();
  t2.join();
}

这将为您提供与 2 个进程类似的执行。

于 2013-09-15T19:52:52.567 回答