您好,我正在使用OpenCV库编写基本的C++应用程序,以将图像中的主体与其背景分离。该应用程序读取一个图像文件,并使用分水岭算法,根据其发现在边缘周围和图像中心的数据来生成掩模。
(首先,我创建了一个图像对象,其整体值为-1。然后,在空图像周围创建一个值为1的边框。接着,我在图像中心大约创建了一个矩形,其值为2。边框和矩形没有接触。)
我尝试使用自动生成的掩模通过对原始图像和掩模进行逐位与操作来从图像中删除数据。
我用C++写了这个程序,如果有人能快速查看我的代码,我会非常感激。我找到的唯一相似的示例是使用Python的本地OpenCV绑定。
示例掩模:http://i.imgur.com/a0SUwy3.png
示例图像:http://i.imgur.com/FQywu6P.png
// 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 blank(image.size(),CV_8U,cv::Scalar(0xFF));
cv::Mat dest(image.size(),CV_8U,cv::Scalar(0xFF));
imshow("originalimage", image);
// Create markers image
cv::Mat markers(image.size(),CV_8U,cv::Scalar(-1));
//Rect(topleftcornerX, topleftcornerY, width, height);
//top rectangle
markers(Rect(0,0,image.cols, 5)) = Scalar::all(1);
//bottom rectangle
markers(Rect(0,image.cols-5,image.cols, 5)) = Scalar::all(1);
//left rectangle
markers(Rect(0,0,5,image.rows)) = Scalar::all(1);
//right rectangle
markers(Rect(image.cols-5,0,5,image.rows)) = Scalar::all(1);
//centre rectangle
markers(Rect(image.cols/2,image.rows/2,50, 50)) = Scalar::all(2);
//Create watershed segmentation object
WatershedSegmenter segmenter;
segmenter.setMarkers(markers);
cv::Mat result = segmenter.process(image);
result.convertTo(result,CV_8U);
bitwise_and(image, blank, dest, result);
imshow("final_result", dest);
cv::waitKey(0);
return 0;
}