zoukankan      html  css  js  c++  java
  • OpenCV学习(7)--

    阈值操作:

     1 class ThresholdDemoExamlpe {
     2     // 阈值操作
     3 public:
     4     //static int thresholdValue = 0;
     5     //static int thresholdType = 3;
     6     //static int const maxValue = 255;
     7     static int thresholdValue;
     8     static int thresholdType;
     9     static int const maxValue;
    10     static int const maxType = 4;
    11     static int const maxBINARYvalue = 255;
    12     static cv::Mat src; 
    13     static cv::Mat src_gray;
    14     static cv::Mat dst;
    15 
    16     static void ThresholdDemo(int, void*) {
    17         // 0: Binary
    18         // 1: Binary Inverted
    19         // 2: Threshold Truncated
    20         // 3: Threshold to Zero
    21         // 4: Threshold to Zero Inverted
    22         // 图像二值化
    23         // https://blog.csdn.net/u012566751/article/details/77046445
    24         cv::threshold(src_gray, dst, thresholdValue, maxBINARYvalue, thresholdType);
    25         cv::imshow("Threshold Demo", dst);
    26     }
    27 
    28     int show(void) {    
    29         src = cv::imread("dog.jpg", cv::IMREAD_COLOR);
    30         if (src.empty())
    31             return -1;
    32 
    33         cv::cvtColor(src, src_gray, cv::COLOR_BGR2GRAY);  // 转化为灰度图像
    34         cv::namedWindow("Threshold Demo", cv::WINDOW_AUTOSIZE);
    35         cv::createTrackbar("Type: 
     0: Binary 
     1: Binary Inverted 
     2: Truncate 
     3: To Zero 
     4: To Zero Inverted", "Threshold Demo", &thresholdType, maxType, ThresholdDemo);
    36         cv::createTrackbar("Value", "Threshold Demo", &thresholdValue, maxValue, ThresholdDemo);
    37         ThresholdDemo(0, 0);
    38 
    39         cv::waitKey(0);
    40         return 0;
    41     }
    42 
    43 };

    Object detection:

     1 class ObjectDetection {
     2 public:
     3     static int low_r;
     4     static int low_g;
     5     static int low_b;
     6     static int high_r;
     7     static int high_g;
     8     static int high_b;
     9 
    10     static void on_low_r_thresh_trackbar(int, void*) {
    11         low_r = min(high_r - 1, low_r);
    12         // openCV提供createTrackbar指定图像窗口创建一个指定名称和范围的滑动条,使用户能够滑动调整输入,然后根据输入值执行程序。
    13         // 还提供了getTrackbarPos和setTrackbarPos以获取和修改bar的当前值。
    14         // https://blog.csdn.net/u010963435/article/details/78682725
    15         cv::setTrackbarPos("Low R", "Object Detection", low_r);
    16     }
    17 
    18     static void on_high_r_thresh_trackbar(int, void*) {
    19         high_r = min(high_r, low_r + 1);
    20         cv::setTrackbarPos("High R", "Object Detection", high_r);
    21     }
    22 
    23     static void on_low_g_thresh_trackbar(int, void*) {
    24         low_g = min(high_g - 1, low_g);
    25         cv::setTrackbarPos("Low G", "Object Detection", low_g);
    26     }
    27 
    28     static void on_high_g_thresh_trackbar(int, void*) {
    29         high_g = min(high_g, low_g + 1);
    30         cv::setTrackbarPos("High G", "Object Detection", high_g);
    31     }
    32 
    33     static void on_low_b_thresh_trackbar(int, void*) {
    34         low_b = min(high_b - 1, low_b);
    35         cv::setTrackbarPos("Low B", "Object Detection", low_b);
    36     }
    37 
    38     static void on_high_b_thresh_trackbar(int, void*) {
    39         high_b = min(high_b, low_b + 1);
    40         cv::setTrackbarPos("High B", "Object Detection", high_b);
    41     }
    42 
    43     static int show() {
    44         cv::Mat frame, frame_threshold;
    45         //cv::VideoCapture cap(0);  // //视频捕捉设备 id ---笔记本电脑的用0表示
    46         frame = cv::imread("angel.jpg", cv::IMREAD_COLOR);
    47         cv::namedWindow("Video Capture", cv::WINDOW_NORMAL);
    48         cv::namedWindow("Object Detection", cv::WINDOW_NORMAL);
    49 
    50         // 创建滑动条 设定阈值
    51         cv::createTrackbar("Low R", "Object Detection", &low_r, 255, on_low_r_thresh_trackbar);
    52         cv::createTrackbar("HIgh R", "Object Detection", &high_r, 255, on_high_r_thresh_trackbar);
    53         cv::createTrackbar("Low G", "Object Detection", &low_g, 255, on_low_g_thresh_trackbar);
    54         cv::createTrackbar("HIgh G", "Object Detection", &high_g, 255, on_high_g_thresh_trackbar);
    55         cv::createTrackbar("Low B", "Object Detection", &low_b, 255, on_low_b_thresh_trackbar);
    56         cv::createTrackbar("HIgh B", "Object Detection", &high_b, 255, on_high_b_thresh_trackbar);
    57 
    58         //while (true) {
    59             //cap >> frame;
    60             //if (frame.empty())
    61                 //break;
    62 
    63             //cv::inRange(frame, cv::Scalar(low_b, low_g, low_r), cv::Scalar(high_b, high_g, high_r), frame_threshold);
    64             //cv::imshow("Video Capture", frame);
    65             //cv::imshow("Object Detection", frame_threshold);
    66         //}
    67         cv::inRange(frame, cv::Scalar(low_b, low_g, low_r), cv::Scalar(high_b, high_g, high_r), frame_threshold);
    68         cv::imshow("Video Capture", frame);
    69         cv::imshow("Object Detection", frame_threshold);
    70 
    71         return 0;
    72     }
    73 };
    74 /*
    75 int ObjectDetection::low_b = 30;
    76 int ObjectDetection::low_g = 30;
    77 int ObjectDetection::low_r = 30;
    78 int ObjectDetection::high_b = 100;
    79 int ObjectDetection::high_g = 100;
    80 int ObjectDetection::high_r = 100;
    81 */

    使用cv::filter2D创建线性过滤器:

     1 int createFilterExample(void) {
     2     // 使用cv::filter2D创建线性过滤器
     3     cv::Mat src, dst, kernel;
     4     cv::Point anchor = cv::Point(-1, -1);   // 中心点;
     5     double delta = 0;
     6     int ddepth = -1;
     7     int kernelSize;
     8     int ind = 0;
     9 
    10     src = cv::imread("small.jpg", cv::IMREAD_COLOR);
    11     if (src.empty())
    12         return -1;
    13 
    14     cv::imshow("Src", src);
    15 
    16     kernelSize = 3;
    17     kernel = cv::Mat::ones(kernelSize, kernelSize, CV_32F);
    18     cv::filter2D(src, dst, ddepth, kernel, anchor, delta, cv::BORDER_DEFAULT);
    19     cv::imshow("kernel size 3", dst);
    20     /*
    21         kernelSize = 5;
    22         kernel = cv::Mat::ones(kernelSize, kernelSize, CV_32F);
    23         cv::filter2D(src, dst, ddepth, kernel, anchor, delta, cv::BORDER_DEFAULT);
    24         cv::imshow("kernel size 5", dst);
    25 
    26         kernelSize = 7;
    27         kernel = cv::Mat::ones(kernelSize, kernelSize, CV_32F);
    28         cv::filter2D(src, dst, ddepth, kernel, anchor, delta, cv::BORDER_DEFAULT);
    29         cv::imshow("kernel size 7", dst);
    30 
    31         kernelSize = 9;
    32         kernel = cv::Mat::ones(kernelSize, kernelSize, CV_32F);
    33         cv::filter2D(src, dst, ddepth, kernel, anchor, delta, cv::BORDER_DEFAULT);
    34         cv::imshow("kernel size 9", dst);
    35 
    36         kernelSize = 11;
    37         kernel = cv::Mat::ones(kernelSize, kernelSize, CV_32F);
    38         cv::filter2D(src, dst, ddepth, kernel, anchor, delta, cv::BORDER_DEFAULT);
    39         cv::imshow("kernel size 11", dst);
    40     */
    41 
    42     cv::waitKey(0);
    43     return 0;
    44 }

    扩充图像边缘:

     1 int makeBorder(void) {
     2     // 扩充图像边缘
     3     cv::Mat src, dst;
     4     src = cv::imread("Lisa.png", cv::IMREAD_COLOR);
     5     if (src.empty())
     6         return -1;
     7 
     8     cv::namedWindow("Make Border", cv::WINDOW_AUTOSIZE);
     9     int top = (int)(0.05 * src.rows);
    10     int bottom = (int)(0.05 * src.rows);
    11     int left = (int)(0.05 * src.cols);
    12     int right = (int)(0.05 * src.cols);
    13     dst = src;
    14     cv::imshow("Make Border", dst);
    15     cv::RNG rng(12345);
    16     cv::Scalar value(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
    17     // 扩充图像边缘
    18     // https://blog.csdn.net/qq_22764813/article/details/52787553
    19     //cv::copyMakeBorder(src, dst, top, bottom, left, right, cv::BORDER_CONSTANT, value);
    20     cv::copyMakeBorder(src, dst, top, bottom, left, right, cv::BORDER_REPLICATE, value);
    21     cv::imshow("Make Border", dst);
    22 
    23     cv::waitKey(0);
    24     return 0;
    25 }

    sobel算子的使用:

     1 int sobelExample(void) {
     2     cv::Mat image, src, src_gray, grad;
     3     int ddepth = CV_16S;
     4 
     5     image = cv::imread("Lisa.png", cv::IMREAD_COLOR);
     6     if (image.empty())
     7         return -1;
     8 
     9     // 高斯滤波 减少图像中的噪音
    10     cv::GaussianBlur(image, src, cv::Size(3, 3), 0, 0, cv::BORDER_DEFAULT);
    11     // 转换为灰度图片
    12     cv::cvtColor(src, src_gray, cv::COLOR_BGR2GRAY);
    13     cv::Mat grad_x, grad_y, abs_grad_x, abs_grad_y;
    14     // Gradient X
    15     // sobel算子是一种常用的边缘检测算子,是一阶的梯度算法。
    16     // https://blog.csdn.net/streamchuanxi/article/details/51542141
    17     cv::Sobel(src_gray, grad_x, ddepth, 1, 0, 3, 1, 0, cv::BORDER_DEFAULT);
    18     // Gradient Y
    19     cv::Sobel(src_gray, grad_y, ddepth, 0, 1, 3, 1, 0, cv::BORDER_DEFAULT);
    20 
    21     cv::convertScaleAbs(grad_x, abs_grad_x);
    22     cv::convertScaleAbs(grad_y, abs_grad_y);
    23 
    24     cv::addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
    25 
    26     cv::imshow("Sobel Demo", grad);
    27 
    28 
    29     cv::waitKey(0);
    30     return 0;
    31 }

    拉普拉斯变换示例:

     1 int LaplaceOperatorExample(void) {
     2     // 拉普拉斯变换
     3     cv::Mat src, src_gray, dst;
     4     int kernel_size = 3;
     5     int scale = 1;
     6     int delta = 0;
     7     int ddepth = CV_16S;
     8     string window_name = "Laplace Demo";
     9     src = cv::imread("Lisa.png", cv::IMREAD_COLOR);
    10     if (src.empty())
    11         return -1;
    12 
    13     cv::GaussianBlur(src, src, cv::Size(3, 3), 0, 0, cv::BORDER_DEFAULT);
    14     cv::cvtColor(src, src_gray, cv::COLOR_BGR2GRAY);
    15     cv::Mat abs_dst;
    16     // 拉普拉斯变换
    17     cv::Laplacian(src_gray, dst, ddepth, kernel_size, scale, delta, cv::BORDER_DEFAULT);
    18     cv::convertScaleAbs(dst, abs_dst);
    19     cv::imshow(window_name, abs_dst);
    20 
    21     cv::waitKey(0);
    22     return 0;
    23 }

    Canny边缘检测器使用:

     1 int showCanny(void) {
     2     // Canny边缘检测器
     3     cv::Mat src, src_gray, dst, detected_edges;
     4     int lowThreshold = 25;
     5     int ratio = 3;
     6     int kernel_size = 3;
     7     src = cv::imread("small.jpg", cv::IMREAD_COLOR);
     8     if (src.empty())
     9         return -1;
    10 
    11     dst.create(src.size(), src.type());
    12     cv::cvtColor(src, src_gray, cv::COLOR_BGR2GRAY);
    13     cv::namedWindow("Edge Map", cv::WINDOW_AUTOSIZE);
    14     cv::blur(src_gray, detected_edges, cv::Size(3, 3));
    15     // https://blog.csdn.net/u013488563/article/details/18889557
    16     cv::Canny(detected_edges, detected_edges, lowThreshold, lowThreshold * ratio, kernel_size);
    17     dst = cv::Scalar::all(0);
    18     src.copyTo(dst, detected_edges);
    19     cv::imshow("Edge Map", dst);
    20 
    21 
    22     cv::waitKey(0);
    23     return 0;
    24 }

    检测直线和圆:

     1 int HoughLineExample(void) {   // 运行有点问题
     2     // Hough Line变换 用于检测直线
     3     cv::Mat src = cv::imread("LineCircle.jpg", cv::IMREAD_COLOR);
     4     if (src.empty())
     5         return -1;
     6 
     7     cv::imshow("Src", src);
     8     cv::Mat dst, cdst;
     9     cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);
    10     cv::imshow("Gray", dst);
    11     cv::Canny(dst, cdst, 50, 200, 3);
    12     cv::imshow("Canny src", cdst);
    13     //cv::cvtColor(dst, cdst, cv::COLOR_GRAY2BGR);
    14     //cv::imshow("BGR", cdst);
    15 
    16     vector<cv::Vec2f> lines;
    17     cv::HoughLines(cdst, lines, 1, CV_PI / 180, 100, 0, 0);
    18     for (int i = 0; i < lines.size(); i++) {
    19         float rho = lines[i][0], theta = lines[i][1];
    20         cv::Point pt1, pt2;
    21         double a = cos(theta), b = sin(theta);
    22         double x0 = a * rho, y0 = b * rho;
    23         pt1.x = cvRound(x0 + 1000 * (-b));
    24         pt1.y = cvRound(y0 + 1000 * (a));
    25         pt2.x = cvRound(x0 - 1000 * (-b));
    26         pt2.y = cvRound(y0 - 1000 * (a));
    27         cv::line(cdst, pt1, pt2, cv::Scalar(255, 0, 0), 3, 8);
    28     }
    29     cv::imshow("detected lines", cdst);
    30 
    31     cv::waitKey(0);
    32     return 0;
    33 }
    34 
    35 
    36 
    37 int DetectCircle(void) {
    38     // Hough Circle 检测图像中的圆
    39     //cv::Mat image = cv::imread("bowl.jpg", cv::IMREAD_COLOR);
    40     cv::Mat image = cv::imread("LineCircle.jpg", cv::IMREAD_COLOR);
    41     if (image.empty())
    42         return -1;
    43     cv::imshow("Src", image);
    44 
    45     cv::Mat res;
    46     res.create(image.size(), image.type());
    47     cv::Mat gray;
    48     cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    49     cv::imshow("Gray", gray);
    50     // 中值滤波
    51     cv::medianBlur(gray, gray, 5);
    52     vector<cv::Vec3f> circles;
    53     // http://www.manongjc.com/article/42132.html
    54     cv::HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1, gray.rows / 16, 100, 30, 50, 300);
    55     // 单独一个圆可以检测出来 当圆和其他直线相交 就测出来多个圆
    56 
    57 
    58     for (int i = 0; i < circles.size(); i++) {
    59         cv::Vec3i c = circles[i];
    60         cv::circle(res, cv::Point(c[0], c[1]), c[2], cv::Scalar(0, 0, 255), 3, cv::LINE_AA);
    61         cv::circle(res, cv::Point(c[0], c[1]), 2, cv::Scalar(0, 255, 0), 3, cv::LINE_AA);
    62     }
    63 
    64     cv::imshow("Detected Circles", res);
    65 
    66     cv::waitKey(0);
    67     return 0;
    68 }

    简单重映射:

     1 int RemapExample(void) {
     2     // 简单重映射
     3     cv::Mat src = cv::imread("dog.jpg", cv::IMREAD_COLOR);
     4     cv::Mat dst;
     5     dst.create(src.size(), src.type());
     6     cv::Mat map_x, map_y;
     7     map_x.create(src.size(), CV_32FC1);
     8     map_y.create(src.size(), CV_32FC1);
     9     cv::namedWindow("Remap demo", cv::WINDOW_AUTOSIZE);
    10 
    11     for (int j = 0; j < src.rows; j++) {
    12         for (int i = 0; i < src.cols; i++) {
    13             // 上下翻转
    14             //map_x.at<float>(j, i) = (float)i;
    15             //map_y.at<float>(j, i) = (float)(src.rows - j);
    16 
    17             // 左右翻转
    18             //map_x.at<float>(j, i) = (float)(src.cols - i);
    19             //map_y.at<float>(j, i) = (float)j;
    20 
    21             // 上下左右都翻转
    22             //map_x.at<float>(j, i) = (float)(src.cols - i);
    23             //map_y.at<float>(j, i) = (float)(src.rows - j);
    24 
    25             // 缩小 
    26             if (i > src.cols * 0.25 && i < src.cols * 0.75 && j > src.rows * 0.25 && j < src.rows * 0.75) {
    27                 map_x.at<float>(j, i) = 2 * (i - src.cols * 0.25f) + 0.5f;
    28                 map_y.at<float>(j, i) = 2 * (j - src.rows * 0.25f) + 0.5f;
    29             }
    30             else {
    31                 map_x.at<float>(j, i) = 0;
    32                 map_y.at<float>(j, i) = 0;
    33             }
    34         }
    35     }
    36 
    37     // https://blog.csdn.net/sss_369/article/details/52983123
    38     // cv::remap()就是对原图像各个像素点改变位置 
    39     cv::remap(src, dst, map_x, map_y, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
    40     cv::imshow("Remap demo", dst);
    41 
    42 
    43     cv::waitKey(0);
    44     return 0;
    45 }
  • 相关阅读:
    Palindrome Partitioning
    Minimum Path Sum
    Maximum Depth of Binary Tree
    Minimum Depth of Binary Tree
    Unique Binary Search Trees II
    Unique Binary Search Trees
    Merge Intervals
    Merge Sorted Array
    Unique Paths II
    C++ Primer Plus 笔记第九章
  • 原文地址:https://www.cnblogs.com/lnlin/p/13790362.html
Copyright © 2011-2022 走看看