Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何知道/设置拍摄(抓取)图像的频率?_Image Processing_Frame Rate_Ros - Fatal编程技术网

Image processing 如何知道/设置拍摄(抓取)图像的频率?

Image processing 如何知道/设置拍摄(抓取)图像的频率?,image-processing,frame-rate,ros,Image Processing,Frame Rate,Ros,我已经在ros论坛上发布了这个问题,但我想在这里再次发布,以覆盖更多的受众 问题是,我发现我从两次连续回调之间的时间计算的频率和使用rostopic hz计算的频率完全不同 通过rostopichz/pg_15508342/image_raw我得到: average rate: 99.681 min: 0.003s max: 0.017s std dev: 0.00093s window: 797 average rate: 99.683 min: 0.003s max: 0.0

我已经在ros论坛上发布了这个问题,但我想在这里再次发布,以覆盖更多的受众

问题是,我发现我从两次连续回调之间的时间计算的频率和使用rostopic hz计算的频率完全不同

通过
rostopichz/pg_15508342/image_raw
我得到:

average rate: 99.681
    min: 0.003s max: 0.017s std dev: 0.00093s window: 797
average rate: 99.683
    min: 0.003s max: 0.017s std dev: 0.00098s window: 896
average rate: 99.682
    min: 0.003s max: 0.017s std dev: 0.00100s window: 997
average rate: 99.682
    min: 0.003s max: 0.017s std dev: 0.00098s window: 1097
average rate: 99.684
    min: 0.002s max: 0.018s std dev: 0.00102s window: 1196
average rate: 99.681
    min: 0.002s max: 0.018s std dev: 0.00106s window: 1296
average rate: 99.676
但是,从这段很短的代码中,计算调用同一主题的回调的频率

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <time.h>
#include <boost/timer.hpp>
#include <boost/thread.hpp>
#include <boost/thread/thread.hpp>
#include <boost/version.hpp>
#include  "boost/bind.hpp"
#include  "boost/bind.hpp"
#include <iostream>

using namespace std;

boost::posix_time::ptime time1; 
boost::posix_time::time_duration timeloop;
double timeloop_sc;

int image_itr(0);

void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
     //---
      if(image_itr == 0)
        time1 = boost::posix_time::microsec_clock::local_time();

      timeloop =  boost::posix_time::microsec_clock::local_time() - time1;
  time1 = boost::posix_time::microsec_clock::local_time();
  timeloop_sc = 1e-3* (double)timeloop.total_milliseconds();
  cout << "itr " << image_itr++ << "   fps: " << 1.0/timeloop_sc << endl;

}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "image_listener");
  ros::NodeHandle nh;

  cv::namedWindow("view");
  cv::startWindowThread();
  image_transport::ImageTransport it(nh);
  image_transport::Subscriber sub = it.subscribe("/pg_15508342/image_raw", 1, imageCallback);
  ros::spin();
  cv::destroyWindow("view");
}
为什么会有这种价值观的差异

另外,如果我运行相同的代码,但仅从另一台主机添加
cv::imshowfrom
,我甚至会得到一个完全不同的值。更清楚地说,假设am使用
本地
机器,而我的ros节点是在
车载
机器上实现和编译的。我在本地执行此操作:

ssh onboard@ip
rosrun package node
也许那个
cv::imshowfrom
正在消耗大量带宽。。。。然而,代码应该在
车载
机器上运行,而不是在
本地
机器上运行,因此计算时间应该是相同的


关于信息,我使用一个点灰色相机,变色龙3。至于驱动程序,我使用的是Kumar robotics驱动程序中的ROS 3节点。我在Ubuntu16,4.6.4-040604-lowlatency内核上运行这个程序。

好吧,我认为你对回调调用时间的估计并不完全是rostopic hz所做的。为了得到更接近的结果,请尝试只计算回调调用之间的延迟,而不进行任何进一步的处理。这将避免额外的计算时间

void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
 if(image_itr == 0)
        time1 = boost::posix_time::microsec_clock::local_time();

  timeloop =  boost::posix_time::microsec_clock::local_time() - time1;
  time1 = boost::posix_time::microsec_clock::local_time();
  timeloop_sc = 1e-3* (double)timeloop.total_milliseconds();
  cout << "itr " << image_itr++ << "   fps: " << 1.0/timeloop_sc << endl;
}
此外,我认为如果您提及您在ROS下使用的摄像头类型和驱动程序,将会有所帮助


希望有帮助

这些标签和你的问题有什么关系?这不是一个C++问题。这不是ssh问题…@AndersLindén我更新了我的问题,我发现我犯了一个愚蠢的错误。事实上,这30 fps是由于命令
waitKey(30)
。我现在完全删除了那个部分。。。。但我仍然有不一致的问题。我正在更新我的问题
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
 if(image_itr == 0)
        time1 = boost::posix_time::microsec_clock::local_time();

  timeloop =  boost::posix_time::microsec_clock::local_time() - time1;
  time1 = boost::posix_time::microsec_clock::local_time();
  timeloop_sc = 1e-3* (double)timeloop.total_milliseconds();
  cout << "itr " << image_itr++ << "   fps: " << 1.0/timeloop_sc << endl;
}
image_transport::Subscriber sub = it.subscribe("/pg_15508342/image_raw", 1000, imageCallback);