Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
C++ openCV中的Absdiff可以编译但显示黑色图像_C++_Opencv_Ros - Fatal编程技术网

C++ openCV中的Absdiff可以编译但显示黑色图像

C++ openCV中的Absdiff可以编译但显示黑色图像,c++,opencv,ros,C++,Opencv,Ros,我一直在尝试使用absdiff来查找图像中的运动,但不幸的是它失败了,我是OpenCV新手。编码应该使用absdiff来确定周围是否有任何运动发生,但对于diff1、diff2和运动,输出是一个黑色。同时,下一帧,当前帧,上一帧显示灰度图像。而,结果显示清晰正常的图像。我用这个作为我的参考。我认为所有的图像内存都加载了相同的帧并进行了比较,这就解释了为什么它是一个漆黑的画面。还有其他我错过的方法吗?我正在使用RTSP将摄像头RAW图像传递到ROS void imageCallback(c

我一直在尝试使用
absdiff
来查找图像中的运动,但不幸的是它失败了,我是OpenCV新手。编码应该使用
absdiff
来确定周围是否有任何运动发生,但对于
diff1
diff2
运动
,输出是一个黑色。同时,
下一帧
当前帧
上一帧
显示灰度图像。而,
结果
显示清晰正常的图像。我用这个作为我的参考。我认为所有的图像内存都加载了相同的帧并进行了比较,这就解释了为什么它是一个漆黑的画面。还有其他我错过的方法吗?我正在使用RTSP将摄像头RAW图像传递到ROS

    void imageCallback(const sensor_msgs::ImageConstPtr&msg_ptr){

    CvPoint center;
    int radius, posX, posY;

    cv_bridge::CvImagePtr cv_image;     //To parse image_raw from rstp
    try
    {
        cv_image = cv_bridge::toCvCopy(msg_ptr, enc::BGR8);
    }
    catch (cv_bridge::Exception& e)
    {
      ROS_ERROR("cv_bridge exception: %s", e.what());
      return;
    }

    frame = new IplImage(cv_image->image);    //frame now holding raw_image
    frame1 = new IplImage(cv_image->image); 
    frame2 = new IplImage(cv_image->image); 
    frame3 = new IplImage(cv_image->image); 

     matriximage = cvarrToMat(frame);
     cvtColor(matriximage,matriximage,CV_RGB2GRAY);  //grayscale

     prev_mframe = cvarrToMat(frame1);
     cvtColor(prev_mframe,prev_mframe,CV_RGB2GRAY);  //grayscale
     current_mframe = cvarrToMat(frame2);
     cvtColor(current_mframe,current_mframe,CV_RGB2GRAY);  //grayscale
     next_mframe = cvarrToMat(frame3);
     cvtColor(next_mframe,next_mframe,CV_RGB2GRAY);  //grayscale

     // Maximum deviation of the image, the higher the value, the more motion is allowed
    int max_deviation = 20;

    result=matriximage;

    //rellocate image in right order
    prev_mframe = current_mframe;
    current_mframe = next_mframe;
    next_mframe = matriximage;
    //motion=difflmg(prev_mframe,current_mframe,next_mframe);

    absdiff(prev_mframe,next_mframe,diff1); //Here should show black and white image
    absdiff(next_mframe,current_mframe,diff2);
    bitwise_and(diff1,diff2,motion);
    threshold(motion,motion,35,255,CV_THRESH_BINARY);
    erode(motion,motion,kernel_ero);


    imshow("Motion Detection",result);
    imshow("diff1",diff1);  //I tried to output the image but its all black
    imshow("diff2",diff2);  //same here, I tried to output the image but its all black
    imshow("diff1",motion);
    imshow("nextframe",next_mframe);
    imshow("motion",motion);

    char c =cvWaitKey(3);  }

我将cv_bridge方法更改为VideoCap,它的功能似乎很好,cv_bridge无法保存图像,即使我将IplImage更改为Mat格式。也许还有其他的方法,但是现在,我会先用这个方法

VideoCapture cap(0); 
Tracker(void)
{
    //check if camera worked
    if(!cap.isOpened())
    {
        cout<<"cannot open the Video cam"<<endl;
    }
    cout<<"camera is opening"<<endl;

    cap>>prev_mframe;
    cvtColor(prev_mframe,prev_mframe,CV_RGB2GRAY);  // capture 3 frame and convert to grayscale
    cap>>current_mframe;
    cvtColor(current_mframe,current_mframe,CV_RGB2GRAY);  
    cap>>next_mframe;
    cvtColor(next_mframe,next_mframe,CV_RGB2GRAY); 

    //rellocate image in right order
    current_mframe.copyTo(prev_mframe);
    next_mframe.copyTo(current_mframe);
    matriximage.copyTo(next_mframe);

    motion = diffImg(prev_mframe, current_mframe, next_mframe);
}
VideoCapture(0);
追踪器(无效)
{
//检查摄像机是否工作
如果(!cap.isOpened())
{

我可以将cv_bridge方法更改为VideoCap,它似乎运行良好,即使我将IplImage更改为Mat格式,cv_bridge也无法保存图像。也许还有其他方法,但现在,我将首先使用此方法

VideoCapture cap(0); 
Tracker(void)
{
    //check if camera worked
    if(!cap.isOpened())
    {
        cout<<"cannot open the Video cam"<<endl;
    }
    cout<<"camera is opening"<<endl;

    cap>>prev_mframe;
    cvtColor(prev_mframe,prev_mframe,CV_RGB2GRAY);  // capture 3 frame and convert to grayscale
    cap>>current_mframe;
    cvtColor(current_mframe,current_mframe,CV_RGB2GRAY);  
    cap>>next_mframe;
    cvtColor(next_mframe,next_mframe,CV_RGB2GRAY); 

    //rellocate image in right order
    current_mframe.copyTo(prev_mframe);
    next_mframe.copyTo(current_mframe);
    matriximage.copyTo(next_mframe);

    motion = diffImg(prev_mframe, current_mframe, next_mframe);
}
VideoCapture(0);
追踪器(无效)
{
//检查摄像机是否工作
如果(!cap.isOpened())
{

cout1.不要使用IplImage api,它已经过时了。请使用cv::Mat!2.我猜您的
frame3=新的IplImage(cv_image->image);
不复制数据,但使用相同的内存。您需要使用深度复制方法。这可以解释为什么您的adsDiff到处都是0,如果您只是从自身减去相同的图像。谢谢,这是否意味着如果我使用深度复制方法CopyTo()和Clone()函数有助于解决此问题?我正在使用ROS使用函数cv_bridge来转录原始图像,cv::Mat是否也支持原始图像?或者需要从IplImage到Mat的转换?尝试在所有cvArrToMat行和整个“//重新定位图像中以正确的顺序克隆或复制到,而不是分配”部分。但是,在您的示例代码中,frame、frame1、frame2和frame3将保存相同的图像信息,无论如何?尝试加载/使用不同的图像!看起来您只是在尝试运行初始化代码,可能缺少一个循环,在该循环中,您加载新图像并迭代更新上一帧/当前帧/下一帧??我想我找到了对于这些问题,我无法使用cv_桥来保存图像,我需要使用VideoCap函数。1.不要使用IplImage api,它已经过时。请使用cv::Mat!2.我猜您的
frame3=新IplImage(cv_image->image);
不复制数据,但使用相同的内存。您需要使用深度复制方法。这可以解释为什么您的adsDiff到处都是0,如果您只是从自身减去相同的图像。谢谢,这是否意味着如果我使用深度复制方法CopyTo()和Clone()函数有助于解决此问题?我正在使用ROS使用函数cv_bridge来转录原始图像,cv::Mat是否也支持原始图像?或者需要从IplImage到Mat的转换?尝试在所有cvArrToMat行和整个“//重新定位图像中以正确的顺序克隆或复制到,而不是分配”部分。但是,在您的示例代码中,frame、frame1、frame2和frame3将保存相同的图像信息,无论如何?尝试加载/使用不同的图像!看起来您只是在尝试运行初始化代码,可能缺少一个循环,在该循环中,您加载新图像并迭代更新上一帧/当前帧/下一帧??我想我找到了对于这些问题,我不能使用cv_桥来保存图像,我需要使用VideoCap函数。