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期望输入和输出图像具有相同的大小; 这是您的代码,上面有一些修复: // 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的输入图像进行测试,这就是我得到的: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |