本帖最后由 erp80 于 2019-6-2 16:56 编辑
- using namespace std;
- using namespace cv;
- using namespace cv::xphoto;
- #include "stdafx.h"
- #include <iostream>
- #include<vector>
- #include<algorithm>
- #include <opencv2\opencv.hpp>
- #include <opencv2\highgui\highgui.hpp>
- using namespace std;
- using namespace cv;
-
- //轮廓按照面积大小升序排序
- bool ascendSort(vector<Point> a, vector<Point> b) {
- return a.size() < b.size();
-
- }
-
- //轮廓按照面积大小降序排序
- bool descendSort(vector<Point> a, vector<Point> b) {
- return a.size() > b.size();
- }
-
- //自己实现的将灰度图像转为三通道的BGR图像
- cv::Mat gray2BGR(cv::Mat grayImg) {
- if (grayImg.channels() == 3)
- return grayImg;
- cv::Mat bgrImg = cv::Mat::zeros(grayImg.size(), CV_8UC3);
- std::vector<cv::Mat> bgr_channels;
- cv::split(bgrImg, bgr_channels);
- bgr_channels.at(0) = grayImg;
- bgr_channels.at(1) = grayImg;
- bgr_channels.at(2) = grayImg;
- cv::merge(bgr_channels, bgrImg);
- return bgrImg;
- }
-
- //自定义的drawImage函数的功能类似于OpenCV的drawContours函数
- cv::Mat drawImage(cv::Mat image, vector< vector< Point> > pointV) {
- cv::Mat destImage=image.clone();
- if (destImage.channels()==1)
- {
- destImage = gray2BGR(destImage);
- }
- for (size_t i=0;i<pointV.size();i++)
- {
- for (size_t j = 0; j<pointV.at(i).size(); j++)
- {
- cv::Point point = pointV.at(i).at(j);
- destImage.at<Vec3b>(point) = cv::Vec3b(0, 0, saturate_cast<uchar>(255-i*5));
- }
-
- }
- return destImage;
- }
- int main() {
- Mat srcImage = imread("D:\\OpencvTest\\mask5.jpg");
- cv::imshow("srcImage", srcImage);
- Mat thresholdImage;
- Mat grayImage;
- cvtColor(srcImage, grayImage, CV_BGR2GRAY);
- threshold(grayImage, thresholdImage, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
- cv::Mat mask = thresholdImage.clone();
- //(1)CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE
- vector< vector< Point> > contours1;
- findContours(mask, contours1, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
- cv::Mat destImage = drawImage(mask, contours1);
- imshow("destImage", destImage);
-
- //(2)CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE
- vector< vector< Point> > contours2;
- findContours(mask, contours2, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
- cv::Mat destImage2 = drawImage(mask, contours2);
- imshow("destImage2", destImage2);
-
- //(3)CV_RETR_LIST, CV_CHAIN_APPROX_NONE
- vector< vector< Point> > contours3;
- findContours(mask, contours3, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
- cv::Mat destImage3 = drawImage(mask, contours3);
- imshow("destImage3", destImage3);
-
-
- //(4)CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE
- vector< vector< Point> > contours4;
- findContours(mask, contours4, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
- cv::Mat destImage4 = drawImage(mask, contours4);
- imshow("destImage4", destImage4);
-
-
- //cv::Mat imge2 = gray2BGR(mask);
- //drawContours(imge2, contours4, -1, cv::Scalar(0, 0, 255), 1);
- //cv::fillConvexPoly(mask, contours1.at(0), cv::Scalar(255, 255, 255));
- cv::waitKey(0);
- return 0;
- }
复制代码
|