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