openCVのSobelメソッドの結果を使用して画像の勾配方向を決定しようとしています。sobelから画像の勾配方向を決定していますか?
これは非常に簡単な作業であるはずです。私はここからいくつかのリソースと回答からメソッドをコピーしましたが、結果の方向をいつでも0〜57度(私は範囲が0〜360になると予想します)の間にあります。
私はすべての深さが正しいと信じています。私は16Uデータと8Uデータを使って方向を計算しようとしました。
どこが間違っているのか分かりません。誰も私の間違いを見つけられますか?
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);
cv::Mat abs_grad_x = cv::Mat::zeros(original->height, original->width, CV_8U);
cv::Mat abs_grad_y = cv::Mat::zeros(original->height, original->width, CV_8U);;
/// Gradient X
cv::Sobel(original_Mat, grad_x, CV_16S, 1, 0, 3);
cv::convertScaleAbs(grad_x, abs_grad_x);
/// Gradient Y
cv::Sobel(original_Mat, grad_y, CV_16S, 0, 1, 3);
cv::convertScaleAbs(grad_y, abs_grad_y);
uchar* pixelX = abs_grad_x.data;
uchar* pixelY = abs_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 = 0;
for(int i = 0; i < grad_x.rows * grad_x.cols; i++)
{
int directionRAD = atan2(pixelY[i], pixelX[i]);
int directionDEG = directionRAD/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.";
}
}
}
感謝。私はあなたが示唆したように切り捨ての問題を修正しましたが、大きな違いはありませんでした。私はまだ勾配方向0〜90(180度補正を適用して180〜270)の制限数を取得します。私はもはや値をスケーリングせず、したがって、Sobel操作によって与えられた生の16S値を使用しています。 画像全体の処理を進めてきましたが、どこが間違っているのか分かりません。あなたはなにか考えはありますか?ありがとう。 – CVirtuous
abs操作も削除しましたか?もしそうなら、最新のコードを新しい質問として投稿することをお勧めします。 –
はい、私はしました。今私は新しい質問を投稿します。ありがとうございました。 – CVirtuous