Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // OpenCVApplication.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include "common.h"
- #include <math.h>
- #include <queue>
- #include <vector>
- #include <random>
- void testOpenImage()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src;
- src = imread(fname);
- imshow("image", src);
- waitKey();
- }
- }
- void testOpenImagesFld()
- {
- char folderName[MAX_PATH];
- if (openFolderDlg(folderName) == 0)
- return;
- char fname[MAX_PATH];
- FileGetter fg(folderName, "bmp");
- while (fg.getNextAbsFile(fname))
- {
- Mat src;
- src = imread(fname);
- imshow(fg.getFoundFileName(), src);
- if (waitKey() == 27) //ESC pressed
- break;
- }
- }
- void testResize()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src;
- src = imread(fname);
- Mat dst1, dst2;
- //without interpolation
- resizeImg(src, dst1, 320, false);
- //with interpolation
- resizeImg(src, dst2, 320, true);
- imshow("input image", src);
- imshow("resized image (without interpolation)", dst1);
- imshow("resized image (with interpolation)", dst2);
- waitKey();
- }
- }
- void testVideoSequence()
- {
- VideoCapture cap("Videos/rubic.avi"); // off-line video from file
- //VideoCapture cap(0); // live video from web cam
- if (!cap.isOpened()) {
- printf("Cannot open video capture device.\n");
- waitKey(0);
- return;
- }
- Mat edges;
- Mat frame;
- char c;
- while (cap.read(frame))
- {
- Mat grayFrame;
- cvtColor(frame, grayFrame, CV_BGR2GRAY);
- imshow("source", frame);
- imshow("gray", grayFrame);
- c = cvWaitKey(0); // waits a key press to advance to the next frame
- if (c == 27) {
- // press ESC to exit
- printf("ESC pressed - capture finished\n");
- break; //ESC pressed
- };
- }
- }
- void testSnap()
- {
- VideoCapture cap(0); // open the deafult camera (i.e. the built in web cam)
- if (!cap.isOpened()) // openenig the video device failed
- {
- printf("Cannot open video capture device.\n");
- return;
- }
- Mat frame;
- char numberStr[256];
- char fileName[256];
- // video resolution
- Size capS = Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),
- (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
- // Display window
- const char* WIN_SRC = "Src"; //window for the source frame
- namedWindow(WIN_SRC, CV_WINDOW_AUTOSIZE);
- cvMoveWindow(WIN_SRC, 0, 0);
- const char* WIN_DST = "Snapped"; //window for showing the snapped frame
- namedWindow(WIN_DST, CV_WINDOW_AUTOSIZE);
- cvMoveWindow(WIN_DST, capS.width + 10, 0);
- char c;
- int frameNum = -1;
- int frameCount = 0;
- for (;;)
- {
- cap >> frame; // get a new frame from camera
- if (frame.empty())
- {
- printf("End of the video file\n");
- break;
- }
- ++frameNum;
- imshow(WIN_SRC, frame);
- c = cvWaitKey(10); // waits a key press to advance to the next frame
- if (c == 27) {
- // press ESC to exit
- printf("ESC pressed - capture finished");
- break; //ESC pressed
- }
- if (c == 115){ //'s' pressed - snapp the image to a file
- frameCount++;
- fileName[0] = NULL;
- sprintf(numberStr, "%d", frameCount);
- strcat(fileName, "Images/A");
- strcat(fileName, numberStr);
- strcat(fileName, ".bmp");
- bool bSuccess = imwrite(fileName, frame);
- if (!bSuccess)
- {
- printf("Error writing the snapped image\n");
- }
- else
- imshow(WIN_DST, frame);
- }
- }
- }
- void MyCallBackFunc(int event, int x, int y, int flags, void* param)
- {
- //More examples: http://opencvexamples.blogspot.com/2014/01/detect-mouse-clicks-and-moves-on-image.html
- Mat* src = (Mat*)param;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- printf("Pos(x,y): %d,%d Color(RGB): %d,%d,%d\n",
- x, y,
- (int)(*src).at<Vec3b>(y, x)[2],
- (int)(*src).at<Vec3b>(y, x)[1],
- (int)(*src).at<Vec3b>(y, x)[0]);
- }
- }
- void testMouseClick()
- {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", MyCallBackFunc, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- /* Histogram display function - display a histogram using bars (simlilar to L3 / PI)
- Input:
- name - destination (output) window name
- hist - pointer to the vector containing the histogram values
- hist_cols - no. of bins (elements) in the histogram = histogram image width
- hist_height - height of the histogram image
- Call example:
- showHistogram ("MyHist", hist_dir, 255, 200);
- */
- void showHistogram(const string& name, int* hist, const int hist_cols, const int hist_height)
- {
- Mat imgHist(hist_height, hist_cols, CV_8UC3, CV_RGB(255, 255, 255)); // constructs a white image
- //computes histogram maximum
- int max_hist = 0;
- for (int i = 0; i<hist_cols; i++)
- if (hist[i] > max_hist)
- max_hist = hist[i];
- double scale = 1.0;
- scale = (double)hist_height / max_hist;
- int baseline = hist_height - 1;
- for (int x = 0; x < hist_cols; x++) {
- Point p1 = Point(x, baseline);
- Point p2 = Point(x, baseline - cvRound(hist[x] * scale));
- line(imgHist, p1, p2, CV_RGB(255, 0, 255)); // histogram bins colored in magenta
- }
- imshow(name, imgHist);
- }
- /******* Lab 1*******/
- void negate_image(){
- Mat img = imread("Images/cameraman.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- img.at<uchar>(i, j) = 255 - img.at<uchar>(i, j);
- }
- }
- imshow("negative image", img);
- waitKey();
- }
- #define ADDITIVE_CONSTANT 100
- void addGrayLevels(){
- Mat img = imread("Images/cameraman.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(img.size(), CV_8UC1);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- dest.at<uchar>(i, j) = (img.at<uchar>(i, j) + ADDITIVE_CONSTANT) % 255;
- }
- }
- imshow("src image", img);
- imshow("dest image", dest);
- waitKey();
- }
- #define MULTIPLICATIVE_CONSTANT 50
- void multiplyGrayLevels(){
- Mat img = imread("Images/cameraman.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(img.size(), CV_8UC1);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- dest.at<uchar>(i, j) = (img.at<uchar>(i, j) * MULTIPLICATIVE_CONSTANT) % 255;
- }
- }
- imshow("src image", img);
- imshow("dest image", dest);
- waitKey();
- }
- //funtion that creates a colored image of 4 squares: white, red, green, yellow
- void createColouredImage(){
- Vec3b WHITE = { 255, 255, 255 };
- Vec3b RED = { 0, 0, 255 };
- Vec3b GREEN = { 0, 255, 0 };
- Vec3b YELLOW = { 0, 255, 255 };
- Mat img = Mat(256, 256, CV_8UC3);
- //white square
- for (int i = 0; i < img.rows / 2; i++){
- for (int j = 0; j < img.cols / 2; j++){
- img.at<Vec3b>(i, j) = WHITE;
- }
- for (int j = img.cols / 2; j < img.cols; j++){
- img.at<Vec3b>(i, j) = RED;
- }
- }
- for (int i = img.rows / 2; i < img.rows; i++){
- for (int j = 0; j < img.cols / 2; j++){
- img.at<Vec3b>(i, j) = GREEN;
- }
- for (int j = img.cols / 2; j < img.cols; j++){
- img.at<Vec3b>(i, j) = YELLOW;
- }
- }
- imshow("coloured image", img);
- waitKey();
- }
- //function that displays only a circle from the given image
- int R = 100;
- void displayCircle(){
- Mat img = imread("Images/cameraman.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(img.size(), CV_8UC1);
- int centerI = img.rows / 2;
- int centerJ = img.cols / 2;
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- if (((centerI - i)*(centerI - i) + (centerJ - j)*(centerJ - j)) < R*R){
- dest.at<uchar>(i, j) = img.at<uchar>(i, j);
- }
- else{
- dest.at<uchar>(i, j) = 0;
- }
- }
- }
- imshow("src image", img);
- imshow("dest image", dest);
- waitKey();
- }
- void flip(){
- Mat img = imread("Images/cameraman.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(img.size(), CV_8UC1);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- dest.at<uchar>(i, j) = img.at<uchar>(i, img.cols - j - 1);
- }
- }
- imshow("src image", img);
- imshow("dest image", dest);
- waitKey();
- }
- /*LABORATORY 2 WORK*/
- void convertToGreyscale(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_COLOR);
- Mat dest = Mat(img.size(), CV_8UC1);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- Vec3b pixel = img.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- dest.at<uchar>(i, j) = (B + G + R) / 3;
- }
- }
- imshow("src image", img);
- imshow("dest image", dest);
- waitKey();
- }
- }
- void displayRedGreenBlueImages(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_COLOR);
- Mat red = Mat(img.size(), CV_8UC1);
- Mat green = Mat(img.size(), CV_8UC1);
- Mat blue = Mat(img.size(), CV_8UC1);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- Vec3b pixel = img.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- red.at<uchar>(i, j) = R;
- green.at<uchar>(i, j) = B;
- blue.at<uchar>(i, j) = G;
- }
- }
- imshow("src image", img);
- imshow("red image", red);
- imshow("green image", green);
- imshow("blue image", blue);
- waitKey();
- }
- }
- void treshholding(){
- uchar threshHoldValue;
- printf("Introduce threshhold value\n");
- std::cin >> threshHoldValue;
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(src.size(), CV_8UC1);
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- uchar pixelValue = src.at<uchar>(i, j);
- if (pixelValue < threshHoldValue){
- dest.at<uchar>(i, j) = 0;//black
- }
- else{
- dest.at<uchar>(i, j) = 255;//white
- }
- }
- }
- imshow("src image", src);
- imshow("dest image", dest);
- waitKey();
- }
- }
- void convertRgbToHSV(unsigned char R, unsigned char G, unsigned char B, unsigned char *H_unsigned_char, unsigned char *S_unsigned_char, unsigned char *V_unsigned_char){
- //conversion
- float r = (float)R / 255; // r : componenta R normalizata
- float g = (float)G / 255; // g : componenta G normalizata
- float b = (float)B / 255; // b : componenta B normalizata
- // Atentie declarati toate variabilele pe care le folositi de tip float
- // Daca ati declarat R de tip uchar, trebuie sa faceti cast: r = (float)R/255 !!!
- float M = max(max(r, g), b);
- float m = min(min(r, g), b);
- float C = M - m;
- //value
- float V = M;
- //saturation
- float S;
- if (C)
- S = C / V;
- else // grayscale
- S = 0;
- //hue
- float H;
- if (C) {
- if (M == r) H = 60 * (g - b) / C;
- if (M == g) H = 120 + 60 * (b - r) / C;
- if (M == b) H = 240 + 60 * (r - g) / C;
- }
- else // grayscale
- H = 0;
- if (H < 0)
- H = H + 360;
- *H_unsigned_char = (H * 255) / 360;
- *S_unsigned_char = S * 255;
- *V_unsigned_char = V * 255;
- }
- void convertToHSV(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_COLOR);
- Mat hMat = Mat(img.size(), CV_8UC1);
- Mat sMat = Mat(img.size(), CV_8UC1);
- Mat vMat = Mat(img.size(), CV_8UC1);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- Vec3b pixel = img.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- unsigned char H;
- unsigned char S;
- unsigned char V;
- convertRgbToHSV(R, G, B, &H, &S, &V);
- hMat.at<uchar>(i, j) = H;
- sMat.at<uchar>(i, j) = S;
- vMat.at<uchar>(i, j) = V;
- }
- }
- imshow("src image", img);
- imshow("h image", hMat);
- imshow("s image", sMat);
- imshow("v image", vMat);
- waitKey();
- }
- }
- void drawHistogram(){
- int noOfBins = 255;
- int * h = (int*)malloc(noOfBins * sizeof(int));
- for (int i = 0; i < noOfBins; i++){
- h[i] = 0;
- }
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(src.size(), CV_8UC1);
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- uchar pixelValue = src.at<uchar>(i, j);
- h[pixelValue] ++;
- }
- }
- imshow("src image", src);
- showHistogram("histogram", h, noOfBins, 255);
- //imshow("dest image", dest);
- waitKey();
- }
- }
- int * calculateHistogram(Mat src, int noOfBins){
- int * h = (int*)malloc(noOfBins * sizeof(int));
- for (int i = 0; i < noOfBins; i++){
- h[i] = 0;
- }
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- uchar pixelValue = src.at<uchar>(i, j);
- h[pixelValue] ++;
- }
- }
- return h;
- }
- float * normalizeHistogram(int histogram[], int imageHight, int imageWidth, int noOfBins){
- float M = imageHight*imageWidth;
- float * f = (float*)malloc(noOfBins * sizeof(float));
- for (int i = 0; i < noOfBins; i++){
- f[i] = ((float)histogram[i]) / M;
- }
- return f;
- }
- int* getNearestHistogramMaximums(int maxims[], int noOfMaxims){
- int * result = (int*)malloc(255 * sizeof(int));
- int prevMiddleIndex = 0;
- for (int i = 0; i < noOfMaxims - 1; i++){
- int middleIndex = (maxims[i + 1] - maxims[i]) / 2 + maxims[i];
- for (int j = prevMiddleIndex; j < middleIndex; j++){
- result[j] = prevMiddleIndex;
- }
- prevMiddleIndex = middleIndex;
- }
- return result;
- }
- void multilevelThresholding(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(src.size(), CV_8UC1);
- //STEP1: Determine local maximas
- int * h = calculateHistogram(src, 255);
- float * pdf = normalizeHistogram(h, src.rows, src.cols, 255);
- int * localMaxims = (int*)malloc(255 * sizeof(int));
- localMaxims[0] = 0;
- int localMaxIndex = 1;
- int WH = 5;
- float windowWidth = 2 * WH + 1;
- float TH = 0.0003;
- for (int k = 0 + WH; k <= 255 - WH; k++){
- boolean isBiggerThanAllValues = true;
- float v = 0;
- //histogram values in range[k-WH,k+WH]
- for (int i = k - WH; i <= k + WH; i++){
- v += pdf[i];
- if (pdf[k] < pdf[i]){
- isBiggerThanAllValues = false;
- }
- }
- //compute average value in the interval
- v = v / windowWidth;
- if (isBiggerThanAllValues&&pdf[k] > v + TH){
- localMaxims[localMaxIndex] = k;
- localMaxIndex++;
- }
- }
- localMaxims[localMaxIndex] = 255;
- localMaxIndex++;
- //STEP2: Thresholding
- int * nearMaxs = getNearestHistogramMaximums(localMaxims, localMaxIndex);
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- uchar pixelValue = src.at<uchar>(i, j);
- dest.at<uchar>(i, j) = nearMaxs[pixelValue];
- }
- }
- imshow("src image", src);
- imshow("dest image", dest);
- waitKey();
- }
- }
- uchar addUchar(uchar a, uchar b){
- int sum = a + b;
- if (sum > 255){
- return 255;
- }
- if (sum < 0){
- return 0;
- }
- return sum;
- }
- void floydSteinberg(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(src.size(), CV_8UC1);
- //STEP1: Determine local maximas
- int * h = calculateHistogram(src, 255);
- float * pdf = normalizeHistogram(h, src.rows, src.cols, 255);
- int * localMaxims = (int*)malloc(255 * sizeof(int));
- localMaxims[0] = 0;
- int localMaxIndex = 1;
- int WH = 5;
- float windowWidth = 2 * WH + 1;
- float TH = 0.0003;
- for (int k = 0 + WH; k <= 255 - WH; k++){
- boolean isBiggerThanAllValues = true;
- float v = 0;
- //histogram values in range[k-WH,k+WH]
- for (int i = k - WH; i <= k + WH; i++){
- v += pdf[i];
- if (pdf[k] < pdf[i]){
- isBiggerThanAllValues = false;
- }
- }
- //compute average value in the interval
- v = v / windowWidth;
- if (isBiggerThanAllValues&&pdf[k] > v + TH){
- localMaxims[localMaxIndex] = k;
- std::cout << localMaxims[localMaxIndex] << std::endl;
- localMaxIndex++;
- }
- }
- localMaxims[localMaxIndex] = 255;
- localMaxIndex++;
- //STEP2: Thresholding
- int * nearMaxs = getNearestHistogramMaximums(localMaxims, localMaxIndex);
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- uchar pixelValue = src.at<uchar>(i, j);
- uchar newPixel = nearMaxs[pixelValue];
- src.at<uchar>(i, j) = newPixel;
- uchar error = pixelValue - newPixel;
- if (j + 1 < src.cols){
- src.at<uchar>(i, j + 1) = addUchar(src.at<uchar>(i, j + 1), 7 * error / 16);
- //src.at<uchar>(i, j+1) += 7*error/16;
- if (i + 1 < src.rows){
- src.at<uchar>(i + 1, j + 1) = addUchar(src.at<uchar>(i + 1, j + 1), error / 16);
- //src.at<uchar>(i+1,j+1) += error / 16;
- }
- }
- if (i + 1 < src.rows){
- //src.at<uchar>(i + 1, j) += 5 * error / 16;
- src.at<uchar>(i + 1, j) = addUchar(src.at<uchar>(i + 1, j), 5 * error / 16);
- if (j - 1 >= 0){
- //src.at<uchar>(i + 1, j - 1) += 3 * error / 16;
- src.at<uchar>(i + 1, j - 1) = addUchar(src.at<uchar>(i + 1, j - 1), 3 * error / 16);
- }
- }
- }
- }
- imshow("src image", src);
- waitKey();
- }
- }
- /********* Laboratory 3******************/
- int getArea(Mat src, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel){
- int sum = 0;
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- Vec3b pixel = src.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- sum++;
- }
- }
- }
- return sum;
- }
- int * getCenterOfMass(Mat src, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel, int area){
- int * result = (int*)malloc(2 * sizeof(int));
- int centerOfMassX = 0;
- int centerOfMassY = 0;
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- Vec3b pixel = src.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- centerOfMassX += i;
- centerOfMassY += j;
- }
- }
- }
- centerOfMassX = centerOfMassX / area;
- centerOfMassY = centerOfMassY / area;
- result[0] = centerOfMassX;
- result[1] = centerOfMassY;
- return result;
- }
- float getElongationAxisAngle(Mat src, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel, int * centerOfmass){
- float nominator = 0;
- float denominator = 0;
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- Vec3b pixel = src.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- nominator += (i - centerOfmass[0])*(j - centerOfmass[1]);
- denominator += (j - centerOfmass[1])*(j - centerOfmass[1]) - (i - centerOfmass[0])*(i - centerOfmass[0]);
- }
- }
- }
- nominator *= 2;
- if (nominator == 0 && denominator == 0){
- return PI / 2.0;
- }
- float angleRad = atan2(nominator, denominator);
- float angleDeg = (angleRad * 180) / PI;
- printf("Angle of elongation axis %f\n", angleDeg);
- return angleRad;
- }
- boolean isPointOnPerimeter(Mat src, int i, int j, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel){
- Vec3b pixel;
- if (i - 1 >= 0){
- pixel = src.at<Vec3b>(i - 1, j);
- if (pixel[2] != R_chosenPixel || pixel[1] != G_chosenPixel || pixel[0] != B_chosenPixel){
- return true;
- }
- }
- if (i + 1 < src.rows){
- pixel = src.at<Vec3b>(i + 1, j);
- if (pixel[2] != R_chosenPixel || pixel[1] != G_chosenPixel || pixel[0] != B_chosenPixel){
- return true;
- }
- }
- if (j - 1 >= 0){
- pixel = src.at<Vec3b>(i, j - 1);
- if (pixel[2] != R_chosenPixel || pixel[1] != G_chosenPixel || pixel[0] != B_chosenPixel){
- return true;
- }
- }
- if (j + 1 < src.cols){
- pixel = src.at<Vec3b>(i, j + 1);
- if (pixel[2] != R_chosenPixel || pixel[1] != G_chosenPixel || pixel[0] != B_chosenPixel){
- return true;
- }
- }
- return false;
- }
- int getPerimeter(Mat src, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel){
- int sum = 0;
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- Vec3b pixel = src.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- if (isPointOnPerimeter(src, i, j, R, G, B)){
- sum++;
- }
- }
- }
- }
- return sum;
- }
- float getThinessRatio(int area, int perimiter){
- return 4 * PI *((float)area) / ((float)(perimiter*perimiter));
- }
- int* getHorizontalProjection(Mat src, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel){
- int * h = (int *)malloc(src.rows*sizeof(int));
- for (int i = 0; i < src.rows; i++){
- int value = 0;
- for (int j = 0; j < src.cols; j++){
- Vec3b pixel = src.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- value++;
- }
- }
- h[i] = value;
- }
- return h;
- }
- int* getVerticalProjection(Mat src, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel){
- int * v = (int *)malloc(src.cols*sizeof(int));
- for (int i = 0; i < src.cols; i++){
- int value = 0;
- for (int j = 0; j < src.rows; j++){
- Vec3b pixel = src.at<Vec3b>(j, i);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- value++;
- }
- }
- v[i] = value;
- }
- return v;
- }
- float getAspectRatio(Mat src, unsigned char R_chosenPixel, unsigned char G_chosenPixel, unsigned char B_chosenPixel){
- int cMax = 0;
- int cMin = src.cols;
- int rMax = 0;
- int rMin = src.rows;
- for (int i = 0; i < src.rows; i++){
- for (int j = 0; j < src.cols; j++){
- Vec3b pixel = src.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- if (i < cMin) cMin = i;
- if (i > cMax) cMax = i;
- if (j < cMin) cMin = j;
- if (j > cMax) cMax = j;
- }
- }
- }
- float a = cMax - cMin + 1;
- float b = rMax - rMin + 1;
- return a / b;
- }
- void calculateDetailsForObject(int event, int x, int y, int flags, void* param){
- //More examples: http://opencvexamples.blogspot.com/2014/01/detect-mouse-clicks-and-moves-on-image.html
- Mat* src = (Mat*)param;
- Mat dest = (*src).clone();
- unsigned char G_chosenPixel;
- unsigned char B_chosenPixel;
- unsigned char R_chosenPixel;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- B_chosenPixel = (unsigned char)(*src).at<Vec3b>(y, x)[0],
- G_chosenPixel = (unsigned char)(*src).at<Vec3b>(y, x)[1],
- R_chosenPixel = (unsigned char)(*src).at<Vec3b>(y, x)[2];
- //calculate area
- int area = getArea(*src, R_chosenPixel, G_chosenPixel, B_chosenPixel);
- printf("Area %d \n", area);
- //calculate center of mass
- int* center = getCenterOfMass(*src, R_chosenPixel, G_chosenPixel, B_chosenPixel, area);
- printf("Center of mass %d %d\n", center[0], center[1]);
- //calculate elongation axis angle
- float angleRad = getElongationAxisAngle(*src, R_chosenPixel, G_chosenPixel, B_chosenPixel, center);
- //calculate 2 points on elongation axis
- int xPoint;
- int yPoint;
- if (angleRad == PI / 2){
- ///vertical line
- xPoint = center[0];
- yPoint = center[1] + 1;
- }
- else{
- xPoint = center[0] * sin(angleRad);
- yPoint = center[1] * cos(angleRad);
- }
- Point start = Point(center[0], center[1]);
- Point end = Point(xPoint, yPoint);
- Scalar color = Scalar(0);
- line(*src, start, end, color, 1);
- //calculate perimeter
- int perimiter = getPerimeter(*src, R_chosenPixel, G_chosenPixel, B_chosenPixel);
- printf("Perimiter %d \n", perimiter);
- //calculate thinness ratio
- float thRation = getThinessRatio(area, perimiter);
- printf("Thiness ratio %f\n", thRation);
- //draw image
- for (int i = 0; i < dest.rows; i++){
- for (int j = 0; j < dest.cols; j++){
- Vec3b pixel = dest.at<Vec3b>(i, j);
- unsigned char B = pixel[0];
- unsigned char G = pixel[1];
- unsigned char R = pixel[2];
- if (R == R_chosenPixel&&B == B_chosenPixel&&G == G_chosenPixel){
- if (isPointOnPerimeter(*src, i, j, R, G, B)){
- dest.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
- }
- }
- }
- }
- //draw center
- dest.at<Vec3b>(center[0], center[1]) = Vec3b(0, 0, 0);
- //show the image
- imshow("clone", dest);
- }
- imshow("My Window", *src);
- }
- void displayObjectDetails(){
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", calculateDetailsForObject, &src);
- //the pixel data stored in gloabal variables R,G,B
- // Wait until user press some key
- waitKey(0);
- }
- }
- Mat Traversare_BFS(Mat src, int * noOfLables){
- int label = 0;
- Mat labelled = Mat(src.size(), CV_8UC1);
- for (int i = 0; i < labelled.rows; i++){
- for (int j = 0; j < labelled.cols; j++){
- labelled.at<uchar>(i, j) = 0;
- }
- }
- for (int i = 1; i < labelled.rows - 1; i++){
- for (int j = 1; j < labelled.cols - 1; j++){
- if (src.at<uchar>(i, j) == 0 && labelled.at<uchar>(i, j) == 0){
- label++;
- std::queue<Point> my_queue;
- Point p = Point(i, j);
- labelled.at<uchar>(i, j) = label;
- my_queue.push(p);
- while (!my_queue.empty()){
- Point q = my_queue.front();
- my_queue.pop();
- for (int k = q.x - 1; k <= q.x + 1; k++){
- for (int l = q.y - 1; l <= q.y + 1; l++){
- Point neigh = Point(k, l);
- if (src.at<uchar>(neigh.x, neigh.y) == 0 && labelled.at<uchar>(neigh.x, neigh.y) == 0 && k != q.x&&l != q.y){
- labelled.at<uchar>(neigh.x, neigh.y) = label;
- my_queue.push(neigh);
- }
- }
- }
- }
- }
- }
- }
- *noOfLables = label;
- return labelled;
- }
- void TraversareInLatime(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat sursa = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat destinatie = Mat(sursa.size(), CV_8UC1);
- int label = 0;
- for (int i = 0; i < destinatie.rows; i++){
- for (int j = 0; j < destinatie.cols; j++)
- {
- destinatie.at<uchar>(i, j) = 0;
- }
- }
- for (int i = 1; i < destinatie.rows - 1; i++)
- {
- for (int j = 1; j < destinatie.cols - 1; j++)
- {
- if (sursa.at<uchar>(i, j) == 0 && destinatie.at<uchar>(i, j) == 0)
- {
- label++;
- std::queue<Point> my_queue;
- Point p = Point(i, j);
- destinatie.at<uchar>(i, j) = label;
- my_queue.push(p);
- while (!my_queue.empty()){
- Point q = my_queue.front();
- my_queue.pop();
- for (int k = q.x - 1; k <= q.x + 1; k++){
- for (int l = q.y - 1; l <= q.y + 1; l++){
- Point neigh = Point(k, l);
- if (sursa.at<uchar>(neigh.x, neigh.y) == 0 && destinatie.at<uchar>(neigh.x, neigh.y) == 0 && k != q.x&&l != q.y){
- destinatie.at<uchar>(neigh.x, neigh.y) = label;
- my_queue.push(neigh);
- }
- }
- }
- }
- }
- }
- }
- imshow("Sursa:", sursa);
- imshow("Destinatie:", destinatie);
- waitKey();
- }
- }
- void TraversareInLatimeCuloareRandom(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- int noOfLabels;
- Mat sursa = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat destinatia = Mat(sursa.size(), CV_8UC3);
- Mat labelled = Traversare_BFS(sursa, &noOfLabels);
- Vec3b * colors = (Vec3b*)malloc((noOfLabels + 1)*sizeof(Vec3b));
- for (int i = 1; i <= noOfLabels; i++){
- unsigned char B = rand() % 255;
- unsigned char G = rand() % 255;
- unsigned char R = rand() % 255;
- colors[i] = Vec3b(B, G, R);
- }
- for (int i = 0; i < labelled.rows; i++){
- for (int j = 0; j < labelled.cols; j++)
- {
- int colorIndex = labelled.at<uchar>(i, j);
- if (colorIndex == 0){
- destinatia.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
- }
- else{
- destinatia.at<Vec3b>(i, j) = colors[colorIndex];
- }
- }
- }
- imshow("Sursa:", sursa);
- imshow("Destinatie:", destinatia);
- waitKey();
- }
- }
- void ParcurgereBFSCuloare(Mat img)
- {
- int label = 0;
- Scalar colorVector[1000] = { 0 };
- Scalar color;
- for (int i = 1; i < 1000; i++)
- {
- Scalar color(rand() & 255, rand() & 255, rand() & 255);
- colorVector[i] = color;
- }
- colorVector[0] = Scalar(255, 255, 255);
- Mat labels = Mat::zeros(img.size(), CV_16SC1);
- Mat destinatie = Mat::zeros(img.size(), CV_8UC3);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- {
- if (img.at<uchar>(i, j) == 0 && labels.at<short>(i, j) == 0)
- {
- label++;
- std::queue <Point> que;
- labels.at<short>(i, j) = label;
- que.push({ i, j });
- while (!que.empty())
- {
- Point oldest = que.front();
- uchar neighbors[8];
- int di[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };
- int dj[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
- int x = oldest.x;
- int y = oldest.y;
- for (int k = 0; k < 8; k++)
- {
- int vecin_i = x + di[k];
- int vecin_j = y + dj[k];
- if (vecin_i >= 0 && vecin_j >= 0 && vecin_i<img.rows && vecin_j <img.cols)
- if (img.at<uchar>(vecin_i, vecin_j) == 0 && labels.at<short>(vecin_i, vecin_j) == 0)
- {
- labels.at<short>(vecin_i, vecin_j) = label;
- que.push(Point(vecin_i, vecin_j));
- }
- }
- que.pop();
- }
- }
- }
- for (int i = 1; i < labels.rows - 1; i++)
- for (int j = 1; j < labels.cols - 1; j++)
- {
- Scalar color = colorVector[labels.at<short>(i, j)]; // valabil pt. Met. 1 BFS
- destinatie.at<Vec3b>(i, j)[0] = color[0];
- destinatie.at<Vec3b>(i, j)[1] = color[1];
- destinatie.at<Vec3b>(i, j)[2] = color[2];
- }
- imshow("Sursa:", img);
- imshow("Destinatia:", destinatie);
- waitKey();
- }
- void BFScolor(){
- char fname[MAX_PATH];
- while (openFileDlg(fname)){
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- ParcurgereBFSCuloare(img);
- }
- }
- int minVector(std::vector<int> v){
- int min = MAXINT;
- for (int i = 0; i < v.size(); i++){
- if (v.at(i) < min){
- min = v.at(i);
- }
- }
- return min;
- }
- Mat DouaTreceri(Mat src, int * noOfLables){
- int label = 0;
- std::vector<std::vector<int>> edges;
- Mat labelled = Mat(src.size(), CV_8UC1);
- for (int i = 0; i < labelled.rows; i++){
- for (int j = 0; j < labelled.cols; j++){
- labelled.at<uchar>(i, j) = 0;
- }
- }
- for (int i = 1; i < labelled.rows - 1; i++){
- for (int j = 1; j < labelled.cols - 1; j++){
- if (src.at<uchar>(i, j) == 0 && labelled.at<uchar>(i, j) == 0){
- std::vector<int> L;
- Point Np[4] = { Point(i - 1, j - 1), Point(i - 1, j), Point(i - 1, j + 1), Point(i, j - 1) };
- for (int v = 0; v < 4; v++){
- if (labelled.at<uchar>(Np[v].x, Np[v].y) > 0){
- L.push_back(labelled.at<uchar>(Np[v].x, Np[v].y));
- }
- }
- if (L.size() == 0){
- label++;
- labelled.at<uchar>(i, j) = label;
- }
- else{
- int x = minVector(L);
- labelled.at<uchar>(i, j) = x;
- for (int k = 0; k < L.size(); k++){
- int y = L.at(k);
- if (y != x){
- edges[x].push_back(y);
- edges[y].push_back(x);
- }
- }
- }
- }
- }
- int newLabel = 0;
- int* newLabelled = (int *)malloc((label + 1)*sizeof(int));
- for (int i = 1; i < label; i++){
- if (newLabelled[i] == 0){
- std::queue<int> Q;
- newLabelled[i] = newLabel;
- Q.push(i);
- while (!Q.empty()){
- int x = Q.front();
- Q.pop();
- for (int k = 0; k < edges[x].size(); k++){
- int y = edges[x][k];
- if (newLabelled[y] == 0){
- newLabelled[y] = newLabel;
- Q.push(y);
- }
- }
- }
- }
- }
- for (int i = 0; i < labelled.rows; i++){
- for (int j = 0; j < labelled.cols; j++){
- labelled.at<uchar>(i, j) = newLabelled[labelled.at<uchar>(i, j)];
- }
- }
- *noOfLables = newLabel;
- return labelled;
- }
- }
- void drawLabelsTwo(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(img.size(), CV_8UC3);
- int noOfLabels;
- Mat labelled = DouaTreceri(img, &noOfLabels);
- Vec3b * colors = (Vec3b*)malloc((noOfLabels + 1)*sizeof(Vec3b));
- for (int i = 1; i < noOfLabels; i++){
- unsigned char B = rand() % 255;
- unsigned char G = rand() % 255;
- unsigned char R = rand() % 255;
- colors[i] = Vec3b(B, G, R);
- }
- for (int i = 0; i < labelled.rows; i++){
- for (int j = 0; j < labelled.cols; j++)
- {
- int colorIndex = labelled.at<uchar>(i, j);
- if (colorIndex == 0){
- dest.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
- }
- else{
- dest.at<Vec3b>(i, j) = colors[colorIndex];
- }
- }
- }
- imshow("src image", img);
- imshow("dest image", dest);
- waitKey();
- }
- }
- int main()
- {
- int op;
- do
- {
- system("cls");
- destroyAllWindows();
- printf("Menu:\n");
- printf(" 1 - Open image\n");
- printf(" 2 - Open BMP images from folder\n");
- printf(" 3 - Resize image\n");
- printf(" 4 - Process video\n");
- printf(" 5 - Snap frame from live video\n");
- printf(" 6 - Mouse callback demo\n");
- printf(" 7 - Negate image\n");
- printf(" 8 - Change grey factor by an additive factor\n");
- printf(" 9 - Change grey factor by an multiplicative factor\n");
- printf(" 10 - Create colored image\n");
- printf(" 11 - Display Circle\n");
- printf(" 12 - Flip\n");
- printf(" 13 - Display red, green and blue channels\n");
- printf(" 14 - Greyscale\n");
- printf(" 15 - BinaryTreshholding\n");
- printf(" 16 - Convert rgb to hsv\n");
- printf(" 17 - Draw histogram\n");
- printf(" 18 - Multilevel thresholding\n");
- printf(" 19 - Floyd Steinberg\n");
- printf(" 20 - Display object details\n");
- printf(" 21 - BFS\n");
- printf(" 22 - BFS with colors\n");
- //printf(" 23 - Draw labels two pass\n");
- printf(" 0 - Exit\n\n");
- printf("Option: ");
- scanf("%d", &op);
- switch (op)
- {
- case 1:
- testOpenImage();
- break;
- case 2:
- testOpenImagesFld();
- break;
- case 3:
- testResize();
- break;
- case 4:
- testVideoSequence();
- break;
- case 5:
- testSnap();
- break;
- case 6:
- testMouseClick();
- break;
- case 7:
- negate_image();
- break;
- case 8:
- addGrayLevels();
- break;
- case 9:
- multiplyGrayLevels();
- break;
- case 10:
- createColouredImage();
- break;
- case 11:
- displayCircle();
- break;
- case 12:
- flip();
- break;
- case 13:
- displayRedGreenBlueImages();
- break;
- case 14:
- convertToGreyscale();
- break;
- case 15:
- treshholding();
- break;
- case 16:
- convertToHSV();
- break;
- case 17:
- drawHistogram();
- break;
- case 18:
- multilevelThresholding();
- break;
- case 19:
- floydSteinberg();
- break;
- case 20:
- displayObjectDetails();
- break;
- case 21:
- TraversareInLatime();
- break;
- case 22:
- //TraversareInLatimeCuloareRandom();
- BFScolor();
- break;
- case 23:
- drawLabelsTwo();
- break;
- }
- } while (op != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement