3

こんにちは、画像セグメンテーションは初めてです。指定されたコードを使用して前景オブジェクトを取得しようとしていますが、「cvWatershed でサポートされていない形式または形式の組み合わせ (8 ビット、3 チャネルの入力画像のみがサポートされています)」のようなエラーが発生しました。

cv::Mat img0 = [img toMat];
cv::Mat img1;
cv::cvtColor(img0, img0, CV_RGB2GRAY);
cv::threshold(img0, img0, 100, 255, cv::THRESH_BINARY);

cv::Mat fg;
cv::erode(img0,fg,cv::Mat(),cv::Point(-1,-1),6);

cv::Mat bg;
cv::dilate(img0,bg,cv::Mat(),cv::Point(-1,-1),6);
cv::threshold(bg,bg,1,128,cv::THRESH_BINARY_INV);

cv::Mat markers(img0.size(),CV_8U,cv::Scalar(0));
markers= fg+bg;

// cv::namedWindow("マーカー"); // cv::imshow("マーカー", マーカー);

WatershedSegmenter segmenter;
segmenter.setMarkers(markers);
cv::Mat result1 = segmenter.process(img0);

// cv::Mat 結果 1; result1.convertTo(result1,CV_8U);

UIImage * result = [UIImage imageWithMat:result1 andImageOrientation:[img imageOrientation]];
return result;

そして、デバッグを試みたところ、エラーが発生しました

cv::Mat result1 = segmenter.process(img0);

前もって感謝します

4

2 に答える 2

2

私は再びコードを分析し、問題を解決しました。イメージを ilpImage に変換してから、コードを使用して 8 ビットおよび 3 チャネルのイメージに変更します。

WatershedSegmenter segmenter;
segmenter.setMarkers(markers);
markers=cvCreateImage(cvGetSize(my_iplImage), IPL_DEPTH_8U, 3);
cv::Mat result1 = segmenter.process(markers);
于 2013-05-17T06:30:56.797 に答える
0

これは、本「Opencv 2 computer vision application programming cookbook」の一例を思い出させます。あなたがすべきことは、これを行うことだけでした:

// Get the binary map
    cv::Mat binary;
    //binary = cv::imread("binary.bmp", 0); // prevent loading of pre-converted image
    cvtColor(image, binary, CV_BGR2GRAY); // instead convert original
    binary = binary < 65; // apply threshold

コード全体 (水のセグメンテーション ヘッダーを除く) は次のようになります。

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "watershedSegmentation.h"

int main()
{
    // Read input image
    cv::Mat image = cv::imread("group.jpg");
    if (!image.data)
        return 0;

    // Display the image
    cv::namedWindow("Original Image");
    cv::imshow("Original Image", image);

//  // Get the binary map
    cv::Mat binary;
    //binary = cv::imread("binary.bmp", 0); // prevent loading of pre-converted image
    cvtColor(image, binary, CV_BGR2GRAY); // instead convert original
    binary = binary < 60; // apply threshold

    // Display the binary image
    cv::namedWindow("Binary Image");
    cv::imshow("Binary Image", binary);

    // Eliminate noise and smaller objects
    cv::Mat fg;
    cv::erode(binary, fg, cv::Mat(), cv::Point(-1, -1), 6);

    // Display the foreground image
    cv::namedWindow("Foreground Image");
    cv::imshow("Foreground Image", fg);

    // Identify image pixels without objects
    cv::Mat bg;
    cv::dilate(binary, bg, cv::Mat(), cv::Point(-1, -1), 6);
    cv::threshold(bg, bg, 1, 128, cv::THRESH_BINARY_INV);

    // Display the background image
    cv::namedWindow("Background Image");
    cv::imshow("Background Image", bg);

    // Show markers image
    cv::Mat markers(binary.size(), CV_8U, cv::Scalar(0));
    markers = fg + bg;
    cv::namedWindow("Markers");
    cv::imshow("Markers", markers);

    // Create watershed segmentation object
    WatershedSegmenter segmenter;
    // Set markers and process
    segmenter.setMarkers(markers);
    segmenter.process(image);

    // Display segmentation result
    cv::namedWindow("Segmentation");
    cv::imshow("Segmentation", segmenter.getSegmentation());

    // Display watersheds
    cv::namedWindow("Watersheds");
    cv::imshow("Watersheds", segmenter.getWatersheds());

    cv::waitKey();
    return 0;
}
于 2013-07-24T07:43:13.770 に答える