Область контура не показывает все соответствующие области

nir gallner спросил: 26 ноября 2017 в 04:41 в: c++

Я пытаюсь определить все круги на изображении. После усиления контраста, использования порога, использования хитрых краев, я нахожу все контуры и перебираю их, у которых всегда есть область > 0, которую я представляю на полученном изображении. Результаты не очень хорошие. Пожалуйста, помогите ...

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;
void changeGain(cv::Mat&,double,int);int main(int argc, char** argv)
{// Load the original image and make a duplication
cv::Mat rawImage = cv::imread("..\\3.png");
cv::Mat duplicateImage= rawImage.clone();// Add contrast
changeGain(duplicateImage,1.9 ,-240);// Apply thershold
cv::threshold( duplicateImage, duplicateImage, 150, 200, cv::THRESH_BINARY );// Use canny edges
cv::Mat img_canny;
cv::Canny(duplicateImage,img_canny,150,200);// Find all the contours from the canny image
vector<vector<cv::Point>> contours;
findContours(img_canny, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);// Approximate contours to polygons + get circles
vector<vector<Point> > contours_poly;for( int i = 0; i < contours.size(); i++ )
{
    double area = contourArea(contours[i],true);
    if (area > 0 )
        contours_poly.push_back(contours[i]);
}// Draw the circles on the image
drawContours(rawImage, contours_poly, -1, Scalar(rand() & 255, rand() & 255, rand() & 255));// Show result
cv::imshow("Final Result", rawImage);
cv::waitKey(0);
imwrite("..\\contour_result.jpg",rawImage);}void changeGain(cv::Mat& image,double alpha, int beta)
{
//cv::Mat new_image = cv::Mat::zeros( image.size(), image.type() ); /// Do the operation new_image(i,j) = alpha*image(i,j) + beta
 for( int y = 0; y < image.rows; y++ )
 {
     for( int x = 0; x < image.cols; x++ )
     {
         for( int c = 0; c < 3; c++ )
             image.at<cv::Vec3b>(y,x)[c] =
                     cv::saturate_cast<uchar>( alpha*( image.at<cv::Vec3b>(y,x)[c] ) + beta );    }
 } return;

}

Это оригинальное изображение

Это результат отображения всех контуров

> png> pdf> after> png> >

изображение после canny

0 ответов