OpenCV의 Sobel 방법의 결과를 사용하여 이미지 그라데이션 방향을 결정하려고합니다.
나는 이것이 매우 간단한 작업이어야한다는 것을 이해하고, 나는 이론을 이해한다고 생각하지만 이것을 구현하는 것이 생각보다 더 어려웠습니다.
그라디언트 방향은 0-360도 사이가 될 것으로 예상하지만 내 코드는 모든 그라디언트가 180-270도 사이에 있음을 보여줍니다.
정수 나누기 문제가 포함 된이 코드의 이전 버전을 제출했습니다. 나는 이것을 고쳤지만 제한된 방향 각 문제를 해결하지 못했습니다.
나는 모든 코드를 밟았지만 내가 어디로 잘못 가고 있는지 볼 수 없습니까? 누가 내 실수를 발견 할 수 있습니까?
감사.
void getGradients(IplImage* original, cv::Mat* gradArray)
{
cv::Mat original_Mat(original, true);
// Convert it to gray
cv::cvtColor( original_Mat, original_Mat, CV_RGB2GRAY );
//cv::blur(original_Mat, original_Mat, cv::Size(7,7));
/// Generate grad_x and grad_y
cv::Mat grad_x = cv::Mat::zeros(original->height, original->width, CV_16S);
cv::Mat grad_y = cv::Mat::zeros(original->height, original->width, CV_16S);
/// Gradient X
cv::Sobel(original_Mat, grad_x, CV_16S, 1, 0, 3);
/// Gradient Y
cv::Sobel(original_Mat, grad_y, CV_16S, 0, 1, 3);
uchar* pixelX = grad_x.data;
uchar* pixelY = grad_y.data;
uchar* grad1 = gradArray[0].data;
uchar* grad2 = gradArray[1].data;
uchar* grad3 = gradArray[2].data;
uchar* grad4 = gradArray[3].data;
uchar* grad5 = gradArray[4].data;
uchar* grad6 = gradArray[5].data;
uchar* grad7 = gradArray[6].data;
uchar* grad8 = gradArray[7].data;
int count = 0;
int min = 999999;
int max = -1;
for(int i = 0; i < grad_x.rows * grad_x.cols; i++)
{
double directionRAD = atan2(pixelY[i], pixelX[i]);
int directionDEG = (int)(180 + directionRAD / M_PI * 180);
if(directionDEG < min){min = directionDEG;}
if(directionDEG > max){max = directionDEG;}
if(directionDEG >= 0 && directionDEG <= 45) { grad1[i] = 255; count++;}
if(directionDEG >= 45 && directionDEG <= 90) { grad2[i] = 255; count++;}
if(directionDEG >= 90 && directionDEG <= 135) { grad3[i] = 255; count++;}
if(directionDEG >= 135 && directionDEG <= 190) { grad4[i] = 255; count++;}
if(directionDEG >= 190 && directionDEG <= 225) { grad5[i] = 255; count++;}
if(directionDEG >= 225 && directionDEG <= 270) { grad6[i] = 255; count++;}
if(directionDEG >= 270 && directionDEG <= 315) { grad7[i] = 255; count++;}
if(directionDEG >= 315 && directionDEG <= 360) { grad8[i] = 255; count++;}
if(directionDEG < 0 || directionDEG > 360)
{
cout<<"Weird gradient direction given in method: getGradients.";
}
}
}
grad_x
그리고 grad_y
CV_16SC1 유형의 매트입니다. 즉, 모든 픽셀이 2 바이트를 차지합니다.
그러나 당신은 선언 pixelX
및 pixelY
8 비트 바이트에 대한 포인터이다. 따라서 pixelX[1]
두 번째 그라디언트가 아닌 첫 번째 그라디언트의 두 번째 바이트입니다.
당신은 필요합니다
short* pixelX = grad_x.ptr<short>(0);
short* pixelY = grad_y.ptr<short>(0);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다