9

cv::line で CV_AA フラグが設定されたアンチエイリアス ラインを描画できません。説明するコード例を次に示します。

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;

int main(int argc, char* argv[])
{
    cv::Mat base(100, 100, CV_32F);

    cv::Point2i p1(20, 20);
    cv::Point2i p2(70, 90);

    cv::line(base, p1, p2, cv::Scalar(1.0), 1, CV_AA); // 1 pixel thick, CV_AA == Anti-aliased flag

    cv::namedWindow("line test", CV_NORMAL);
    cv::imshow("line test", base);
    cv::waitKey(0);

    return 0;
}

cv::Point2i の代わりに cv::Point2d を使用してみましたが、違いは見つかりませんでした。(i == integer, d == double) ピクセル幅を 1 よりも大きくしてみましたが、まだ AA はありません。

ただし、ここにある CV_32F (32 ビット float) イメージとは対照的に、これは CV_8U (8 ビット符号なし) イメージで機能します。(CV_8U の場合、cv::Scalar(1.0) の代わりに cv::Scalar(255) を line 関数に渡して比較する必要があります)

現在の回避策は、CV_8U イメージから開始してから変換することだと思いますが、独自のアンチエイリアシング関数を記述する必要のない CV_32F イメージだけでそれを行う簡単な方法はありますか?

何か不足していますか?

OpenCV ドキュメント: cv::line リファレンス

4

2 に答える 2

11
./core/src/drawing.cpp:1569
void line( Mat& img, Point pt1, Point pt2, const Scalar& color,
       int thickness, int line_type, int shift )
{
    if( line_type == CV_AA && img.depth() != CV_8U )
        line_type = 8;
    //omitted
}

ソースコードには、深度が CV_8U でない限り、8-connected メソッドを使用して描画すると記載されています。

于 2014-08-21T07:19:52.890 に答える
7

サンプル画像を提供できますか?私もそれを自分で試しました、そしてそれはこのコードで完全にうまく働いています:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
  cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

  // red line, which is not anti-aliased
  cv::line(img, cv::Point(100, 100), cv::Point(400, 105), cv::Scalar(0,0,200), 3, 4);  

  // green line, which is not anti-aliased
  cv::line(img, cv::Point(100, 200), cv::Point(400, 205), cv::Scalar(0,200,0), 5, 8);

  // blue line, which is anti-aliased
  cv::line(img, cv::Point(100, 300), cv::Point(400, 305), cv::Scalar(200,0,0), 10, CV_AA);

  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);

  cv::waitKey(0);
}

それが私の結果です:
ここに画像の説明を入力してください

于 2012-06-16T13:19:58.603 に答える