В этой функции у меня есть матрица цветов (каждый пиксель может иметь значение от 0 до 9), и я хочу, чтобы уменьшить шум. пиксели, имеющие более 5 соседей, с тем же цветом, будут изменены на этот цвет! я определяю массив [0-9], чтобы удерживать количество цветов соседей, например, если 6 пикселей имеют значение 8 и 2 имеет значение 5, массив должен быть таким [0,0,0,0,0, 2,0,6,0,0], но когда я печатаю массив, значение первого элемента (array [0]) ошибочно, оно начинается с 8 и каждого импульса времени на 8! вот код. вы можете мне помочь?Ошибка строкового массива в OpenCV
void Noise_Reduction(CvMat* Color_mat,boolean showresult){
int tv[__COLORNUM]={0,0,0,0,0,0,0,0,0};
int counter;
for(int y=1;y<Color_mat->height-1;y++)
{
for(int x=1;x<Color_mat->width-1;x++)
{
for(int i=0;i<9;i++,tv[i]=0);
tv[CV_MAT_ELEM(*Color_mat,uchar,y-1,x-1)]++;
tv[CV_MAT_ELEM(*Color_mat,uchar,y-1,x )]++;
tv[CV_MAT_ELEM(*Color_mat,uchar,y-1,x+1)]++;
tv[CV_MAT_ELEM(*Color_mat,uchar,y ,x-1)]++;
tv[CV_MAT_ELEM(*Color_mat,uchar,y ,x+1)]++;
tv[CV_MAT_ELEM(*Color_mat,uchar,y+1,x-1)]++;
tv[CV_MAT_ELEM(*Color_mat,uchar,y+1,x )]++;
tv[CV_MAT_ELEM(*Color_mat,uchar,y+1,x+1)]++;
for(int i=0;i<9;i++){
std::cout<<tv[i]<<",";}
std::cout<<endl;
int max=0;
int indx=0;
max= tv[0];
for(int i = 1; i<__COLORNUM; i++)
{
if(tv[i] > max){
max = tv[i];
indx=i;
}
}
if(max>=5)
{
counter++;
*((uchar*)CV_MAT_ELEM_PTR(*Color_mat, y, x))=(uchar)indx;
//std::cout<<"times:"<<counter <<endl;
}
}
}
std::cout<<"times:"<<counter <<endl;
if(showresult){
IplImage* Noise_result = cvCreateImage(cvSize(Color_mat->width,Color_mat->height),IPL_DEPTH_8U,3);
for(int y=0; y<Noise_result->height; y++) {
uchar* ptr = (uchar*)(Color_mat->data.ptr + y * Color_mat->step);
for(int x=0; x<Noise_result->width; x++) {
switch (*ptr) {
case 1 :
cvSet2D(Noise_result,y,x,oo);
break;
case 2 :
cvSet2D(Noise_result,y,x,bb);
break;
case 3 :
cvSet2D(Noise_result,y,x,yy);
break;
case 4 :
cvSet2D(Noise_result,y,x,gg);
break;
case 5 :
cvSet2D(Noise_result,y,x,ww);
break;
default :
cvSet2D(Noise_result,y,x,uk);
break;
}
ptr++;
}
}
if(showresult)
{
cvNamedWindow("Noiseresult", CV_WINDOW_FREERATIO);
cvShowImage("Noise_result", Noise_result);
cvWaitKey(0);
}
}
}
memset - лучший. Если вы хотите сохранить цикл, это лучше: «for (int i = 0; i <9; i ++) tv [i] = 0;». Как правило, лучше всего использовать управление циклом в скобках for, и реальная работа снаружи. – ugoren
теперь его отлично работает :) – Amir