gpt4 book ai didi

c++ - 分水岭分割opencv xcode

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:54 26 4
gpt4 key购买 nike

我现在正在从 opencv codebook(OpenCV 2 Computer Vision Application Programming Cookbook)学习代码:第 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,cv::Mat(),cv::Point(-1,-1),6);
cv::threshold(bg,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 参数;
  • 请注意,分水岭的结果实际上是 markers 而不是您的代码建议的 image;关于那个,你需要获取 process() 的返回值!

这是您的代码,包含上述修复:

// 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, binary, 100, 255, THRESH_BINARY);

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

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

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

// Create markers image
cv::Mat markers(binary.size(),CV_8U,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 的输入图像进行测试,这就是我得到的:

enter image description here

关于c++ - 分水岭分割opencv xcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11435974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com