Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Subtraction manually

Hi Folks, I'm trying to implement a function which is subtracting 2 images. (the same does subtract() of opencv)...but since OpenCv often needs 8bit-single Channel images I have to normalize my images before subtracting because the images are CV_16UC1. As I want to save time I want to have the images subtracted before normalizing.

so i did it this way: (back-front=mask)

Mat moving=Mat::zeros(240,320,CV_8UC1);
for(int i=0;i<240;i++){
    unsigned short* rowF=front.ptr<unsigned short>(i);
    unsigned short* rowB=back.ptr<unsigned short>(i);
    uchar* rowM=mask.ptr<uchar>(i);
    uchar fg=255;
    uchar bg=0;
for(int j=0;j<320;j++){
   unsigned short m=rowB[j]-rowF[j];
   if(m>=300){ rowM[j]=fg;
      }else rowM[j]=bg;

  }
}

it runs, but: not with the same result. When I try: cout<<"120,160"<<":"<<back.at<unsigned short="">(120,160)<<endl; the="" value="" of="" back="" is="" displayed.="" but="" when="" i="" move="" in="" front="" of="" the="" camera,="" the="" back-value="" changes="" to="" the="" front="" value.="" and="" the="" back-image="" is="" a="" still="" image="" which="" is="" never="" changed="" after="" initialization.<="" p="">

I don't have any ideas what I've done wrong, but you?. Thx for Your help!

Subtraction manually

Hi Folks, I'm trying to implement a function which is subtracting 2 images. (the same does subtract() of opencv)...but since OpenCv often needs 8bit-single Channel images I have to normalize my images before subtracting because the images are CV_16UC1. As I want to save time I want to have the images subtracted before normalizing.

so i did it this way: (back-front=mask)

Mat moving=Mat::zeros(240,320,CV_8UC1);
for(int i=0;i<240;i++){
    unsigned short* rowF=front.ptr<unsigned short>(i);
    unsigned short* rowB=back.ptr<unsigned short>(i);
    uchar* rowM=mask.ptr<uchar>(i);
    uchar fg=255;
    uchar bg=0;
for(int j=0;j<320;j++){
   unsigned short m=rowB[j]-rowF[j];
   if(m>=300){ rowM[j]=fg;
      }else rowM[j]=bg;

  }
}

it runs, but: not with the same result. When I try: try:

cout<<"120,160"<<":"<<back.at<unsigned short="">(120,160)<<endl; the="" value="" of="" back="" is="" displayed.="" but="" when="" i="" move="" in="" front="" of="" the="" camera,="" the="" back-value="" changes="" to="" the="" front="" value.="" and="" the="" back-image="" is="" a="" still="" image="" which="" is="" never="" changed="" after="" initialization.<="" p="">

short>(120,160)<<endl;

the value of back is displayed. but when I move in front of the camera, the back-value changes to the front value. And the back-image is a still image which is never changed after initialization.

I don't have any ideas what I've done wrong, but you?. Thx for Your help!