2017-05-22 9 views
1

이것은 내가 GLESCALE 이미지에서 Sobel 커널을 사용하는 방법입니다. 그러나 실제로 컬러 이미지를 수정하는 방법은 없습니다.컬러 이미지의 가장자리 감지 CannyAlgorithm

void Soble() 
{ 
Mat img; 
int w = 3; 
int k = w/2; 

char fname[MAX_PATH]; 
openFileDlg(fname); 
img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE); 
gaussianFiltering(img); 
Mat destinationImg = img.clone(); 
float sobelY[3][3] = { 1, 2, 1, 0, 0, 0, -1, -2, -1 }; 
float sobelX[3][3] = { -1, 0, 1, -2, 0, 2, -1, 0, 1 }; 
for (int i = k; i < img.rows - k; i++) 
{ 
    for (int j = k; j < img.cols - k; j++) 
    { 
     float Gx = 0, Gy = 0; 

     for (int l = 0; l < w; l++) 
     { 
      for (int p = 0; p < w; p++) 
      { 
       Gx += img.at<uchar>(i + l - k, j + p - k)*sobelX[l][p]; 
       Gy += img.at<uchar>(i + l - k, j + p - k)*sobelY[l][p]; 
      } 
     } 
     destinationImg.at<uchar>(i, j) = sqrt(Gx*Gx + Gy * Gy)/(4 * sqrt(2)); 

    } 
} 
imshow("Intermediar",destinationImg); 
imshow("Initial", img); 
waitKey(0); 

    } 

각 RGB 샤넬을 사용하는 것을 생각했지만 작동하지 않으며 약간의 오차도 있습니다.

 float GxR = 0, GyR = 0; 
     float GxG = 0, GyG = 0; 
     float GxB = 0, GyB = 0; 

     for (int l = 0; l < w; l++) 
     { 
      for (int p = 0; p < w; p++) 
      { 
       GxR += img.at<Vec3b>[0](i + l - k, j + p - k)*sobelX[l][p]; 
       GxG += img.at<Vec3b>[1](i + l - k, j + p - k)*sobelX[l][p]; 
       GxB += img.at<Vec3b>[2](i + l - k, j + p - k)*sobelX[l][p]; 
       GyR += img.at<Vec3b>[0](i + l - k, j + p - k)*sobelY[l][p]; 
       GyG += img.at<Vec3b>[1](i + l - k, j + p - k)*sobelY[l][p]; 
       GyB += img.at<Vec3b>[2](i + l - k, j + p - k)*sobelY[l][p]; 
      } 
     } 
     destinationImg.at<Vec3b>[0](i, j) = sqrt(GxR*GxR + GyR * GyR)/(4 * sqrt(2)); 
     destinationImg.at<Vec3b>[1](i, j) = sqrt(GxG*GxG + GyB * GyB)/(4 * sqrt(2)); 
     destinationImg.at<Vec3b>[2](i, j) = sqrt(GxG*GxG + GyG * GyG)/(4 * sqrt(2)); 

이 코드를 어떻게 다시 작성해야합니까?

+0

"몇 가지 오류"무엇인가? 그것은 의사에게가는 것과 같고 단지 기분이 좋지 않는다고 말하는 것과 같습니다. – Piglet

+0

ErrorC3867 \t 'cv :: Mat :: at': 비표준 구문; '&'를 사용하여 멤버에 대한 포인터를 만듭니다 – TufisiRadu

+0

ErrorC2109 \t 아래 첨자에는 배열 또는 포인터 유형이 필요합니다 – TufisiRadu

답변

0

잘못된 방식으로 이미지 데이터에 액세스합니다.

destinationImg.at<Vec3b>[0](i, j) 

destinationImg은 Vec3b 유형의 매트입니다. 즉, 3 차원 벡터의 2 차원 배열입니다.

You'r [] 연산자는

첨자 오류 메시지가 포인터도 할 수 없습니다 배열도 무언가에 그 연산자를 사용하고 있음을 알려줍니다 ... 잘못된 장소에 있습니다. (i, j)가 예상되는 연산자가 있으므로 다른 오류 메시지가 나타납니다.

먼저 이러한 벡터 중 하나를 얻어야합니다. 그런 다음 요소를 가져올 수 있습니다.

destinationImg.at<Vec3b>(i,j)은 i, j에서 벡터를 제공합니다.

destinationImg.at<Vec3b>(i,j)[0]은 해당 벡터의 첫 번째 요소를 제공합니다. OpenCV의 문서에서

예 :

Vec3b intensity = img.at<Vec3b>(y, x); 
uchar blue = intensity.val[0]; 
uchar green = intensity.val[1]; 
uchar red = intensity.val[2]; 

http://docs.opencv.org/2.4.13.2/doc/user_guide/ug_mat.html