実現したいこと
- 取り込んだ画像内の三角形の部分以外を塗りつぶしたい
前提
opencvで取り込んだ画像内にある三角形に輪郭をつけるプログラムを作りました。
その後に輪郭の外側を黒く塗りつぶしてその画像を出力したいです。
言語はC++です。
試したこと
下記のコードを実行すると画像内の三角形の内側が塗りつぶされました。
#include <ros/ros.h>
#include <opencv2/opencv.hpp>
int main(int argc, char **argv) {
ros::init(argc, argv, "zykei_node"); // ファイルを読み込み グレースケール化 cv::Mat img = cv::imread("/home/robotpc/catkin_ws/src/timesyncsub/src/orbmix/img/test_img2.png", cv::IMREAD_GRAYSCALE); // ガウシアンぼかしを適用してノイズを軽減 // GaussianBlur(img, img, cv::Size(5, 5), 0); // しきい値指定によるフィルタリング cv::Mat threshold; cv::threshold(img, threshold, 240, 255, cv::THRESH_BINARY); // // Cannyエッジ検出 // Canny(img, img, 50, 150); // 輪郭を抽出 std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours(threshold, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 図形の数の変数 int triangle = 0; cv::Mat img_test; cv::Mat img_origin; //図形の設定 for (const auto& cnt : contours) { std::vector<cv::Point> approx; cv::approxPolyDP(cnt, approx, 0.005 * cv::arcLength(cnt, true), true); cv::drawContours(img, std::vector<std::vector<cv::Point>>{approx}, 0, cv::Scalar(0), 2); img_origin = img; int x = approx[0].x; int y = approx[0].y; if (approx.size() == 3) { triangle++; cv::putText(img, "triangle" + std::to_string(triangle), cv::Point(x, y), cv::FONT_HERSHEY_DUPLEX, 0.8, cv::Scalar(1)); cv::fillConvexPoly(img, cnt, cv::Scalar(0, 0, 0)); double area = cv::contourArea(cnt); std::cout << "Area of triangle " << triangle << " = " << area << std::endl; } } // bitwise_xor(img, img_test, img_xor); // 結果の画像作成 cv::imwrite("/home/robotpc/catkin_ws/src/timesyncsub/src/orbmix/img/output__img2.jpg", img); // 図形の数の結果 std::cout << "Number of triangle = " << triangle << std::endl; cv::imshow("Result", img); cv::waitKey(0); return 0;
}
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/12/22 06:26
2023/12/22 06:45
2023/12/22 06:52 編集
2023/12/22 13:44