Атрыманне розніцы паміж двума кадрамі ў OpenCV

Я стараюся, каб атрымаць розніцу паміж двума гатункі :: Mat кадры ў OpenCV. Дык вось што я спрабаваў,

 #include
 #include
 #include
 #include 
 int main ()
 {
    cv::VideoCapture cap(0);
    cv::Mat frame, frame1,frame2;
    int key=0;

    while(key!=27){
       cap >> frame;
       if(key=='c'){
          frame1 = frame;
          key = 0;
       }
       if(key =='x'){
          cv::absdiff(frame, frame1, frame2); //I also tried frame2= (frame -frame1)*255;
          cv::imshow("difference ",frame2);
          key =0;
       }
       cv::imshow("stream",frame);
       key = cv::waitKey(10);
     }
  }

вынік заўсёды адзін і той жа 0 Matrix, любая ідэя, што я раблю няправільна тут? загадзя дзякуй за вашу дапамогу.

3
дзякуй @ raina77ow вынік зараз робіць больш Сэнс
дададзена аўтар Engine, крыніца
Што адбываецца, калі вы заменіце Frame1 = кадр з frame.copyTo (Frame1) ?
дададзена аўтар raina77ow, крыніца

7 адказы

аб'екты МАТ паказальнік набраны. Пасля ўстаноўкі frame1 да кадра непасрэдна з дапамогай frame1 = кадр, абедзве матрыцы паказваюць тую ж самую кропку і той жа кадр таксама. Вы павінны скапіяваць значэнне кадра з выкарыстаннем метаду «CopyTo» цыноўкі.

11
дададзена

OpenCV Матрыца выкарыстоўваць паказальнікі ўнутры

Rel = "noreferrer"> дакументацыя станаў тыпу Mat:

Мат ў асноўным клас з двума часткамі дадзеных: загаловак матрыцы і паказальнік на матрыцу, якое змяшчае значэнне пікселяў. [...] Кожны раз, калі хто-небудзь капіюе загаловак аб'екта Mat, лічыльнік павялічваецца для матрыцы. Кожны раз, калі загаловак чысціцца гэты лічыльнік памяншаецца. Калі лічыльнік дасягне нуля матрыца таксама вызваляецца. <�Моцны> Часам вы хочаце, каб скапіяваць самую Матрыцу таксама, так што OpenCV забяспечвае клон() і CopyTo() функцыі .

cv::Mat F = A.clone();
cv::Mat G;
A.copyTo(G);
7
дададзена

OpenCV Матрыца выкарыстоўваць паказальнікі ўнутры

Rel = "noreferrer"> дакументацыя станаў тыпу Mat:

Мат ў асноўным клас з двума часткамі дадзеных: загаловак матрыцы і паказальнік на матрыцу, якое змяшчае значэнне пікселяў. [...] Кожны раз, калі хто-небудзь капіюе загаловак аб'екта Mat, лічыльнік павялічваецца для матрыцы. Кожны раз, калі загаловак чысціцца гэты лічыльнік памяншаецца. Калі лічыльнік дасягне нуля матрыца таксама вызваляецца. <�Моцны> Часам вы хочаце, каб скапіяваць самую Матрыцу таксама, так што OpenCV забяспечвае клон() і CopyTo() функцыі .

cv::Mat F = A.clone();
cv::Mat G;
A.copyTo(G);
7
дададзена

OpenCV перагружае аператар афектацыі на рэзюмэ :: Mat аб'екты так, каб лінія MAT1 = MAT2 ўплывае толькі на паказальнік на дадзеныя ў MAT1 (г.зн. паказвае на тыя ж дадзеныя, як MAT2 ). Гэта дазваляе пазбегнуць працаёмкіх копіі ўсіх дадзеных малюнка.

Калі вы хочаце захаваць дадзеныя матрыцы, вы павінны напісаць MAT1 = mat2.clone() або mat2.copyTo (MAT1) .

4
дададзена

OpenCV перагружае аператар афектацыі на рэзюмэ :: Mat аб'екты так, каб лінія MAT1 = MAT2 ўплывае толькі на паказальнік на дадзеныя ў MAT1 (г.зн. паказвае на тыя ж дадзеныя, як MAT2 ). Гэта дазваляе пазбегнуць працаёмкіх копіі ўсіх дадзеных малюнка.

Калі вы хочаце захаваць дадзеныя матрыцы, вы павінны напісаць MAT1 = mat2.clone() або mat2.copyTo (MAT1) .

4
дададзена

Я шукаў падобную праграму, і я натыкнуўся на ваш пост, вось прыклад я напісаў для frameDifferencing, спадзяюся, што гэта дапамагае, ніжэй функцыі дасць вам розніцу паміж двума кадрамі

/** @function differenceFrame */
Mat differenceFrame( Mat prev_frame, Mat curr_frame ) 
{
    Mat image = prev_frame.clone();
    printf("frame rows %d Cols %d\n" , image.rows, image.cols);

    for (int rows = 0; rows < image.rows; rows++)
    {
        for (int cols = 0; cols < image.cols; cols++) 
        {   
          /*  printf("BGR value %lf %lf %lf\n" , abs(prev_frame.at(rows,cols)[0] - 
                                              curr_frame.at(rows,cols)[0]), 
                                              abs(prev_frame.at(rows,cols)[1] - 
                                              curr_frame.at(rows,cols)[0]),
                                              abs(prev_frame.at(rows,cols)[2] - 
                                              curr_frame.at(rows,cols)[0]));
            */
            image.at(rows,cols)[0] = abs(prev_frame.at(rows,cols)[0] - 
                                              curr_frame.at(rows,cols)[0]);
            image.at(rows,cols)[1] = abs(prev_frame.at(rows,cols)[1] - 
                                              curr_frame.at(rows,cols)[1]);
            image.at(rows,cols)[2] = abs(prev_frame.at(rows,cols)[2] - 
                                              curr_frame.at(rows,cols)[2]);
        }
    }
    return image;
} 
0
дададзена
Вы можаце апусціць завесы: Mat DIF = curr_frame - prev_frame; Можна таксама выкарыстоўваць absdiff (InputArray src1, InputArray src2, OutputArray ДСТ)
дададзена аўтар user937284, крыніца

Я шукаў падобную праграму, і я натыкнуўся на ваш пост, вось прыклад я напісаў для frameDifferencing, спадзяюся, што гэта дапамагае, ніжэй функцыі дасць вам розніцу паміж двума кадрамі

/** @function differenceFrame */
Mat differenceFrame( Mat prev_frame, Mat curr_frame ) 
{
    Mat image = prev_frame.clone();
    printf("frame rows %d Cols %d\n" , image.rows, image.cols);

    for (int rows = 0; rows < image.rows; rows++)
    {
        for (int cols = 0; cols < image.cols; cols++) 
        {   
          /*  printf("BGR value %lf %lf %lf\n" , abs(prev_frame.at(rows,cols)[0] - 
                                              curr_frame.at(rows,cols)[0]), 
                                              abs(prev_frame.at(rows,cols)[1] - 
                                              curr_frame.at(rows,cols)[0]),
                                              abs(prev_frame.at(rows,cols)[2] - 
                                              curr_frame.at(rows,cols)[0]));
            */
            image.at(rows,cols)[0] = abs(prev_frame.at(rows,cols)[0] - 
                                              curr_frame.at(rows,cols)[0]);
            image.at(rows,cols)[1] = abs(prev_frame.at(rows,cols)[1] - 
                                              curr_frame.at(rows,cols)[1]);
            image.at(rows,cols)[2] = abs(prev_frame.at(rows,cols)[2] - 
                                              curr_frame.at(rows,cols)[2]);
        }
    }
    return image;
} 
0
дададзена
Вы можаце апусціць завесы: Mat DIF = curr_frame - prev_frame; Можна таксама выкарыстоўваць absdiff (InputArray src1, InputArray src2, OutputArray ДСТ)
дададзена аўтар user937284, крыніца