how do I copy specific pixels to destination mat from source mat in opencv c++?
I want to copy specific pixels to destination mat when certain condition becomes true.in addition to that I a switching to next rows upon specific count of pixels that met condition. But it throws memory related exception as follows:
** Error in `/home/ds/eclipse-workspace/pixelenc_current/Debug/pixelenc_current.so': malloc(): memory corruption (fast): 0x0000000001593710 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7ab54)[0x7ffff5521b54]
/lib64/libc.so.6(+0x7ddf7)[0x7ffff5524df7]
/lib64/libc.so.6(__libc_malloc+0x4c)[0x7ffff552710c]
/lib64/libstdc++.so.6(_Znwm+0x1d)[0x7ffff5de11bd]
/usr/local/lib/libopencv_highgui.so.3.3(cvNamedWindow+0xda)[0x7ffff649eeca]
/usr/local/lib/libopencv_highgui.so.3.3(_ZN2cv11namedWindowERKNS_6StringEi+0x38)[0x7ffff64957b8]
/home/ds/eclipse-workspace/pixelenc_current/Debug/pixelenc_current.so[0x409af7]
/home/ds/eclipse-workspace/pixelenc_current/Debug/pixelenc_current.so[0x408d16]
/home/ds/eclipse-workspace/pixelenc_current/Debug/pixelenc_current.so[0x405c7e]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7ffff54c8c05]
/home/ds/eclipse-workspace/pixelenc_current/Debug/pixelenc_current.so[0x401f29]
platform :centos7 +opencv 3.3
code:
unsigned char *input = (unsigned char*)(mask.data); //mask
unsigned char *imginput = (unsigned char*)(img.data); // source data
int m=0,n=0;
for(i=hinfo[1];i<hinfo[1]+hinfo[3];i++)
{
if(hfcnt>=htotalpix) // max no of pixels
break;
int cnt=0;
for(j=hinfo[0];j<hinfo[0]+hinfo[2];j++)
{
valmask=input[mask.cols *i +j ] ;
if(valmask==255) /*condition*/
{
patch1.at<Vec3b>(m,n)[0]=imginput[j*img.cols*1 + i*1 + 0];
patch1.at<Vec3b>(m,n)[1]=imginput[j*img.cols*2 + i*2 + 0];
patch1.at<Vec3b>(m,n)[2]=imginput[j*img.cols*2 + i*3 + 0];
hfcnt++;
cnt++;
}
else
continue;
/* to switch to next row in source*/
if(cnt==hinfo[2])
break;
n++;
}
m++;
}
here are the images extracted using copyTo , in these images there is a area having black pixels which I don't want to copy. That's why I am copying specific pixels.
Here is one of the mask I used to extract sub images. Its different one, right now I cannot produce the mask used to extract above images.
what is hinfo and patch1 ?
your code is broken beyond repair. let's simply forget that.
please try to be more explicit on what you're trying to achieve, so we can help you find a high-level solution for it.
again, writing for-loops like above is always the wrong idea, and you're the umpteeth person shooting his foot like that
Exception is in name cvNamedWindow. Where is cvNamedWindow in your code?
Why do you write :
last line is enough
You use mask.cols i I understand i is a row index... and imginput[jimg.cols*1 now j is a row index ?
^^ imshow() calls namedWindow(), which calls cvNamedWindow()
I want to copy specific pixels from 3 channel matrix to another matrix. Path1 is also 3 channel matrix of same type as of img. its 0,1,2 in patch1.at<vec3b>(m,n)[0].... valmask used in condition checking to check whether that specific pixel is a part of mask or not hinfo[] contains lower and upper bounds of for loop
once copy is completed I am trying to disply patch1 as follows; namedWindow("patch1", CV_WINDOW_AUTOSIZE ); imshow( "patch1", patch1);
I am trying to copy only masked pixels to another patch of same type as of source matrix which is img.
I tried with following code too, but same exception
patch1.at<vec3b>(m,n)=img.at<vec3b>(i.j);
please do not try to "repair" this code.
instead of understanding the problem and getting to the solution people are down voting the question