0

エッジの始点と終点を検出して抽出する最良の方法が何であるかを本当に知りたいのですが、このような画像を黒い素材のさまざまな角度で取得した場合.

ここに画像の説明を入力

ここに画像の説明を入力

エッジを検出するためにガウスぼかしとキャニーオペレーターを使用しているいくつかのアイデアを見つけました。しかし、最初と最後の点の正確なピクセル位置も抽出したいと思います。このタスクを達成するための正しいステップバイステップのコンセプトを誰かが教えてくれたら、本当に素晴らしいことです.

4

1 に答える 1

1

すべての写真が投稿したものと似ている場合 (つまり、すべてのエッジが画像の上部と左側と交差している)、次の単純なプログラムは、エッジの右上の列番号と左下の行番号を見つけます。

cv::Mat im, edge, locs;
im = cv::imread("./lBnUO.jpg", cv::IMREAD_GRAYSCALE);
cv::Canny(im, edge, 0.0, 255.0);
cv::findNonZero(edges(cv::Range(0, 1), cv::Range(0, edge.cols)), locs);
int topRightCol = (locs.at<cv::Point>(0)).x;
cv::findNonZero(edges(cv::Range(0, edge.rows), cv::Range(0, 1)), locs);
int bottomLeftRow = (locs.at<cv::Point>(0)).y;
std::cout << "Top-right point column: " << topRightCol << ", bottom-left point row: "
          << bottomLeftRow << std::endl;

エッジが画像の上部と左側と交差するかどうかわからない場合は、代わりに画像cv::findNonZero全体を使用してedgeください。これは、状況によっては予測しにくい場合があります。

cv::Mat im, edge, locs;
im = cv::imread("./lBnUO.jpg", cv::IMREAD_GRAYSCALE);
cv::Canny(im, edge, 0.0, 255.0);
cv::findNonZero(edge, locs);
int topRightCol = (locs.at<cv::Point>(0)).x;
int bottomLeftRow = (locs.at<cv::Point>(locs.rows-1)).y;
std::cout << "Top-right point column: " << topRightCol << ", bottom-left point row: " 
          << bottomLeftRow << std::endl;

ここで提供される画像の場合、上記の両方のコードが出力されます。

Top-right point column: 190, bottom-left point row: 160
于 2013-05-31T20:33:43.643 に答える