Tôi đang cố gắng xác định hướng hình ảnh bằng cách sử dụng các kết quả từ phương pháp Sobel của openCV.Xác định hướng chuyển ảnh từ sobel?
Tôi hiểu đây phải là một nhiệm vụ rất đơn giản. Tôi đã sao chép các phương pháp từ một số tài nguyên và câu trả lời từ đây, nhưng bất cứ điều gì tôi làm các hướng kết quả luôn ở giữa 0 - 57 độ (tôi mong đợi phạm vi được từ 0-360).
Tôi tin rằng tất cả các độ sâu đều chính xác. Tôi đã thử tính toán hướng sử dụng dữ liệu 16S cũng như dữ liệu 8U.
Tôi không thể thấy mình đang đi sai ở đâu? Ai có thể phát hiện sai lầm của tôi?
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.";
}
}
}
Cám ơn những lời khuyên Paul. Tôi đã sửa vấn đề cắt ngắn như bạn đã đề xuất, tuy nhiên nó không tạo ra nhiều khác biệt. Tôi vẫn nhận được một số giới hạn hướng gradient 0 - 90 (hoặc 180 - 270 với hiệu chỉnh 180 độ được áp dụng). Tôi không còn mở rộng các giá trị và do đó tôi đang sử dụng các giá trị 16S thô do hoạt động Sobel đưa ra. Tôi đã thực hiện quá trình này cho toàn bộ hình ảnh nhưng không thể nhìn thấy nó ở đâu sai. Bạn có bất cứ ý tưởng? Cảm ơn. – CVirtuous
Bạn đã xóa hoạt động abs chưa? Nếu có, thì tôi khuyên bạn nên đăng mã mới nhất của mình làm câu hỏi mới. –
Vâng tôi đã làm. Tôi sẽ đăng câu hỏi mới ngay bây giờ. Cảm ơn bạn. – CVirtuous