OpenCV C++ Crash Course Notes: Samples


Binary Image: 0 or 1

Gray Scale Image:

RGB Image:

Importing Images

cv::Mat img = cv::imread("Path/180.png");
cv::imshow("Image", img);
cv::waitKey(0);
std::string image_path = 
  cv::samples::findFile("Path/180.png");
cv::Mat img = cv::imread(image_path, cv::IMREAD_COLOR);
if (img.empty())
{
  std::cout << "Could not read the image: " << image_path << 
    std::endl;
  return 1;
}

Importing Video

cv::VideoCapture cap("Path/demo.mp4");
cv::Mat img;
while (true)
{
  cap >> img;  // cap.read(img);
  if (img.empty()) break;
  cv::imshow("Image", img);
  cv::waitKey(1);
}

Webcam Reading

cv::VideoCapture cap(0);
if (!cap.isOpened()) return -1;
cv::Mat frame, edges;
cv::namedWindow("edges", cv::WINDOW_AUTOSIZE);
while (true)
{
  cap >> frame;
  cv::cvtColor(frame, edges, cv::COLOR_BGR2GRAY);
  cv::GaussianBlur(edges, edges, cv::Size(7, 7), 1.5, 1.5);
  cv::Canny(edges, edges, 0, 30, 3);
  cv::imshow("edges", edges);
  if (cv::waitKey(30) >= 0) break;
}

Processing: Gray, Blur, Canny Edge Detector

cv::Mat img = cv::imread("Path/180.png");
cv::Mat imgGray;
cv::Mat imgBlur;
cv::Mat imgCanny;
cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);
cv::GaussianBlur(img, imgBlur, cv::Size(7, 7), 5, 0);
cv::Canny(imgBlur, imgCanny, 50, 150);
cv::imshow("Image", img);
cv::imshow("Image Gray", imgGray);
cv::imshow("Image Blur", imgBlur);
cv::imshow("Image Canny", imgCanny);
cv::waitKey(0);

Processing: Dilate, Erode

cv::Mat img = 
  cv::imread("Path/180.png");
cv::Mat imgDil;
cv::cvtColor(img, imgDil, cv::COLOR_BGR2GRAY);
cv::GaussianBlur(imgDil, imgDil, cv::Size(7, 7), 5, 0);
cv::Canny(imgDil, imgDil, 50, 150);
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, 
                                           cv::Size(5, 5));  // odd number
cv::dilate(imgDil, imgDil, kernel);
cv::imshow("Image", img);
cv::imshow("Image Dilate", imgDil);
cv::waitKey(0);
cv::Mat img = 
  cv::imread("Path/180.png");
cv::Mat imgErode;
cv::cvtColor(img, imgErode, cv::COLOR_BGR2GRAY);
cv::GaussianBlur(imgErode, imgErode, cv::Size(7, 7), 5, 0);
cv::Canny(imgErode, imgErode, 50, 150);
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, 
                                           cv::Size(5, 5));  // odd number
cv::dilate(imgErode, imgErode, kernel);
cv::erode(imgErode, imgErode, kernel);
cv::imshow("Image", img);
cv::imshow("Image Erode", imgErode);
cv::waitKey(0);

Resize

cv::Mat img = cv::imread("Path/180.png");
cv::Mat imgResize1;
cv::Mat imgResize2;

std::cout << "Raw Image Size: " << img.size() << std::endl;
cv::resize(img, imgResize1, cv::Size(640, 480));
cv::resize(img, imgResize2, cv::Size(), 0.5, 0.5);

cv::imshow("Image", img);
cv::imshow("Image Resize1", imgResize1);
cv::imshow("Image Resize2", imgResize2);
cv::waitKey(0);

Crop

Region of Interest(RoI)

cv::Mat img = cv::imread("Path/180.png");
cv::Mat imgCrop;
cv::Rect roi(0, 0, 300, 250);
imgCrop = img(roi);
cv::imshow("Image", img);
cv::imshow("Image Crop", imgCrop);
cv::waitKey(0);

Draw Shapes & Text

cv::Mat img(512, 512, CV_8UC3, cv::Scalar(255, 255, 255));  // WHITE
cv::circle(img, cv::Point(100, 100), 100, cv::Scalar(255, 0, 0), 
           5);  // BLUE
cv::circle(img, cv::Point(256, 256), 20, cv::Scalar(255, 0, 255), 
           cv::FILLED);
cv::rectangle(img, cv::Rect{ 50, 50, 100, 50 }, cv::Scalar(0, 0, 
                                                           0), 5);
cv::line(img, cv::Point(130, 296), cv::Point(382, 296), 
         cv::Scalar(0, 0, 0), 2);
cv::putText(img, "Heyulong Workshop", cv::Point(137, 262), 
            cv::FONT_HERSHEY_DUPLEX, 0.75, cv::Scalar(255, 255, 0), 2);
cv::imshow("Image Crop", img);
cv::waitKey(0);

Warping

cv::Mat img = 
cv::imread("Path/H2P_BasicsOfPoker.jpg");
cv::Point2f src[4] = {
  {280, 52}, {395, 170}, {102, 213}, {13, 73}
};
float k = 4.0f;
float width = 50.0 * k;
float height = 80.0 * k;
cv::Point2f dst[4] = {
  {0.0, 0.0}, {width, 0.0}, {width, height}, {0.0, height}
};

cv::Mat matrix, imgWarp;
matrix = cv::getPerspectiveTransform(src, dst);
cv::warpPerspective(img, imgWarp, matrix, cv::Point(width, 
                                                    height));

for (int i = 0; i < 4; ++i)
{
  cv::circle(img, src[i], 10, cv::Scalar(0, 0, 255), 
             cv::FILLED);
}

cv::imshow("Image", img);
cv::imshow("Image Warp", imgWarp);
cv::waitKey(0);

Color Detection & Trackbar

cv::Mat img = cv::imread("Path/180.png");
cv::Mat imgHSV;
cv::cvtColor(img, imgHSV, cv::COLOR_BGR2HSV);
int hmin = 0, smin = 0, vmin = 0;
int hmax = 179, smax = 255, vmax = 255;
cv::namedWindow("Trackbars", (640, 200));
cv::createTrackbar("Hue Min", "Trackbars", &hmin, 179);
cv::createTrackbar("Hue Max", "Trackbars", &hmax, 179);
cv::createTrackbar("Sat Min", "Trackbars", &smin, 255);
cv::createTrackbar("Sat Max", "Trackbars", &smax, 255);
cv::createTrackbar("Val Min", "Trackbars", &vmin, 255);
cv::createTrackbar("Val Max", "Trackbars", &vmax, 255);
while (true)
{
  cv::Scalar lower(hmin, smin, vmin);
  cv::Scalar upper(hmax, smax, vmax);
  cv::Mat mask;
  cv::inRange(imgHSV, lower, upper, mask);

  cv::imshow("Image", img);
  cv::imshow("Image HSV", imgHSV);
  cv::imshow("Image Mask", mask);

  cv::waitKey(1);
}

Detect Shapes & Contours

cv::Mat img = 
cv::imread("Path/Cat03.jpg");
cv::Mat imgProc;

cv::cvtColor(img, imgProc, cv::COLOR_BGR2GRAY);
cv::GaussianBlur(imgProc, imgProc, cv::Size(3, 3), 3, 0);
cv::Canny(imgProc, imgProc, 25, 75);
cv::dilate(imgProc, imgProc, 
           cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)));

std::vector<std::vector<cv::Point>> contours = 
  getContours(imgProc);

std::vector<std::vector<cv::Point>> conPoly(contours.size());
std::vector<cv::Rect> boundRect(contours.size());

for (int i = 0; i < contours.size(); ++i)
{
  int area = cv::contourArea(contours[i]);
  std::cout << area << std::endl;
  if (area < 1000) continue;

  float perimeter = cv::arcLength(contours[i], true);
  cv::approxPolyDP(contours[i], conPoly[i], 0.02 * perimeter, 
                   true);
  cv::drawContours(img, conPoly, i, cv::Scalar(255, 0, 255), 
                   10);
  std::cout << "size: " << conPoly[i].size() << std::endl;

  boundRect[i] = cv::boundingRect(conPoly[i]);
  cv::rectangle(img, boundRect[i].tl(), boundRect[i].br(), 
                cv::Scalar(0, 255, 0), 5);

  int objCor = (int)conPoly[i].size();
  if (objCor == 3)
  {
    std::cout << "triangle" << std::endl;
  }
  else
  {
    //...
  }
  // TODO: put some text
}

cv::imshow("Image", img);
cv::imshow("Image Process", imgProc);
cv::waitKey(0);

Face Detection

// #include <opencv2/objdetect.hpp>
cv::Mat img = 
  cv::imread("Path/180.png");
cv::CascadeClassifier faceCascade;
faceCascade.load("./haarcascade_frontalface_default.xml");

if (faceCascade.empty()) return 1;
else std::cout << "XML file loaded." << std::endl;

std::vector<cv::Rect> faces;
faceCascade.detectMultiScale(img, faces, 1.1, 10);
for (int i = 0; i < faces.size(); ++i)
{
  cv::rectangle(img, faces[i].tl(), faces[i].br(), 
                cv::Scalar(255, 0, 255), 3);
}
cv::imshow("Image", img);
cv::waitKey(0);

References

,

Leave a Reply

Your email address will not be published. Required fields are marked *

css.php