加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++ 分水岭分割opencv xcode

发布时间:2020-12-15 01:43:20 所属栏目:百科 来源:网络整理
导读:我现在正在学习opencv代码簿中的代码(OpenCV 2计算机视觉应用程序设计手册):第5章,使用分水岭分割图像,第131页. 这是我的主要代码: #include "opencv2/opencv.hpp"#include stringusing namespace cv;using namespace std;class WatershedSegmenter { priv
我现在正在学习opencv代码簿中的代码(OpenCV 2计算机视觉应用程序设计手册):第5章,使用分水岭分割图像,第131页.

这是我的主要代码:

#include "opencv2/opencv.hpp"
#include <string>

using namespace cv;
using namespace std;

class WatershedSegmenter {
    private:
    cv::Mat markers;
    public:
    void setMarkers(const cv::Mat& markerImage){
        markerImage.convertTo(markers,CV_32S);
    }

    cv::Mat process(const cv::Mat &image){
        cv::watershed(image,markers);
        return markers;
    }
};

int main ()
{
    cv::Mat image = cv::imread("/Users/yaozhongsong/Pictures/IMG_1648.JPG");

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

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

    // Create markers image
    cv::Mat markers(binary.size(),CV_8U,cv::Scalar(0));
    markers= fg+bg;

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

    imshow("a",image);
    std::cout<<".";
    cv::waitKey(0);
}

但是,它不起作用.我怎么能初始化二进制图像?我怎样才能使这个分段代码工作?

我对这本书的这一部分不是很清楚.
提前致谢!

解决方法

关于你的代码,有几件事应该提到:

> Watershed期望输入和输出图像具有相同的大小;
>你可能想要摆脱方法中的const参数;
>请注意,分水岭的结果实际上是标记,而不是代码所暗示的图像;关于那个,你需要获取进程()的返回!

这是您的代码,上面有一些修复:

// Usage: ./app input.jpg
#include "opencv2/opencv.hpp"
#include <string>

using namespace cv;
using namespace std;

class WatershedSegmenter{
private:
    cv::Mat markers;
public:
    void setMarkers(cv::Mat& markerImage)
    {
        markerImage.convertTo(markers,CV_32S);
    }

    cv::Mat process(cv::Mat &image)
    {
        cv::watershed(image,markers);
        markers.convertTo(markers,CV_8U);
        return markers;
    }
};


int main(int argc,char* argv[])
{
    cv::Mat image = cv::imread(argv[1]);
    cv::Mat binary;// = cv::imread(argv[2],0);
    cv::cvtColor(image,binary,CV_BGR2GRAY);
    cv::threshold(binary,100,255,THRESH_BINARY);

    imshow("originalimage",image);
    imshow("originalbinary",binary);

    // Eliminate noise and smaller objects
    cv::Mat fg;
    cv::erode(binary,2);
    imshow("fg",fg);

    // Identify image pixels without objects
    cv::Mat bg;
    cv::dilate(binary,3);
    cv::threshold(bg,cv::THRESH_BINARY_INV);
    imshow("bg",bg);

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

    // Create watershed segmentation object
    WatershedSegmenter segmenter;
    segmenter.setMarkers(markers);

    cv::Mat result = segmenter.process(image);
    result.convertTo(result,CV_8U);
    imshow("final_result",result);

    cv::waitKey(0);

    return 0;
}

我冒昧地使用Abid的输入图像进行测试,这就是我得到的:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读