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);