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 <queue>;
- using namespace std;
- #define FG 0 // obiect = negru
- #define BG 255 // fond = alb
- typedef struct {
- int x, y;
- byte c;
- } my_point;
- 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 negative_img() {
- Mat img = imread("Images/kids.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dst(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- dst.at<uchar>(i, j) = 255 - img.at<uchar>(i, j);
- imshow("original", img);
- imshow("negative image", dst);
- waitKey(0);
- }
- void changeColor() {
- Mat img = imread("Images/kids.bmp", CV_LOAD_IMAGE_COLOR);
- Mat dst = img.clone();
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- Vec3b pixel = img.at<Vec3b>(i, j);
- Vec3b np = dst.at<Vec3b>(i, j);
- np[0] = 255 - pixel[0];
- np[1] = 255 - pixel[1];
- np[2] = 255 - pixel[2];
- dst.at<Vec3b>(i, j) = np;
- }
- imshow("original", img);
- imshow("negative image", dst);
- waitKey(0);
- }
- void add() {
- Mat img = imread("Images/Lena_24bits_gray.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dst = img.clone();
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- if (img.at<uchar>(i, j) + 50 <= 255)
- dst.at<uchar>(i, j) = img.at<uchar>(i, j) + 50;
- else
- dst.at<uchar>(i, j) = 255;
- imshow("original", img);
- imshow("negative image", dst);
- waitKey(0);
- }
- void mul() {
- Mat img = imread("Images/Lena_24bits_gray.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dst = img.clone();
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- if (img.at<uchar>(i, j) * 2 <= 255)
- dst.at<uchar>(i, j) = img.at<uchar>(i, j) * 2;
- else
- dst.at<uchar>(i, j) = 255;
- imshow("original", img);
- imshow("negative image", dst);
- imwrite("C://Users//Student//Downloads//OpenCVApplication-VS2013_2413_basic\ (1)//OpenCVApplication-VS2013_2413_basic//Images//out.bmp", dst);
- waitKey(0);
- }
- void create() {
- Mat n(256, 256, CV_8UC3);
- for (int i = 0; i < n.rows; i++)
- for (int j = 0; j < n.cols; j++) {
- Vec3b pixel = n.at<Vec3b>(i, j);
- if (i < 128 && j < 128) {
- pixel[0] = 255;
- pixel[1] = 255;
- pixel[2] = 255;
- }
- if (i < 128 && j >= 128) {
- pixel[0] = 0;
- pixel[1] = 0;
- pixel[2] = 255;
- }
- if (i >= 128 && j < 128) {
- pixel[0] = 0;
- pixel[1] = 255;
- pixel[2] = 0;
- }
- if (i >= 128 && j >= 128) {
- pixel[0] = 0;
- pixel[1] = 255;
- pixel[2] = 255;
- }
- n.at<Vec3b>(i, j) = pixel;
- }
- imshow("my img", n);
- waitKey(0);
- }
- void invert() {
- float val[9] = { 5, 6, 1, 8, 9, 3, 2, 5, 4 };
- Mat M(3, 3, CV_32FC1, val);
- std::cout << M << std::endl;
- Mat M2 = M.inv();
- std::cout << M2 << std::endl;
- system("Pause");
- }
- void changeColor3in1() {
- Mat img = imread("Images/kids.bmp", CV_LOAD_IMAGE_COLOR);
- Mat d1, d2, d3;
- d1 = Mat(img.rows, img.cols, CV_8UC1);
- d2 = Mat(img.rows, img.cols, CV_8UC1);
- d3 = Mat(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- Vec3b pix = img.at<Vec3b>(i, j);
- d1.at<uchar>(i, j) = pix[0];
- d2.at<uchar>(i, j) = pix[1];
- d3.at<uchar>(i, j) = pix[2];
- }
- imshow("original", img);
- imshow("img 1", d1);
- imshow("img 2", d2);
- imshow("img 3", d3);
- waitKey(0);
- }
- void colorToGray() {
- Mat img = imread("Images/kids.bmp", CV_LOAD_IMAGE_COLOR);
- Mat dst = Mat(img.rows, img.cols, CV_8UC1);
- Mat dst2 = Mat(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- Vec3b pix = img.at<Vec3b>(i, j);
- dst.at<uchar>(i, j) = (pix[0] + pix[1] + pix[2]) / 3;
- dst2.at<uchar>(i, j) = 0.07 * (float)pix[0] + 0.726 * (float)pix[1] + 0.21 * (float)pix[2];
- }
- imshow("original", img);
- imshow("dest", dst);
- imshow("dest2", dst2);
- waitKey(0);
- }
- void grayToWB() {
- Mat img = imread("Images/Lena_24bits_gray.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat dst = Mat(img.rows, img.cols, CV_8UC1);
- int prag = 50;
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- if (img.at<uchar>(i, j) >= prag)
- dst.at<uchar>(i, j) = 0;
- else
- dst.at<uchar>(i, j) = 255;
- }
- imshow("original", img);
- imshow("dest", dst);
- waitKey(0);
- }
- void RGBtoHSV() {
- Mat img = imread("Images/Lena_24bits.bmp", CV_LOAD_IMAGE_COLOR);
- Mat h = Mat(img.rows, img.cols, CV_8UC1);
- Mat s = Mat(img.rows, img.cols, CV_8UC1);
- Mat v = Mat(img.rows, img.cols, CV_8UC1);
- float r, g, b, M, m, C, H, S, V;
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- Vec3b pix = img.at<Vec3b>(i, j);
- r = (float)pix[2] / 255;
- g = (float)pix[1] / 255;
- b = (float)pix[0] / 255;
- M = max(r, g, b);
- m = min(r, g, b);
- C = M - m;
- V = M;
- if (C)
- S = C / V;
- else
- S = 0;
- 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
- H = 0;
- if (H < 0)
- H += 360;
- H = H * 255 / 360;
- S = S * 255;
- V = V * 255;
- h.at<uchar>(i, j) = (uchar)H;
- s.at<uchar>(i, j) = (uchar)S;
- v.at<uchar>(i, j) = (uchar)V;
- }
- imshow("original", img);
- imshow("H", h);
- imshow("S", s);
- imshow("V", v);
- waitKey(0);
- }
- int* calculHistograma(Mat img) {
- int *hist = (int*)malloc(sizeof(int) * 256);
- for (int i = 0; i < 256; i++)
- hist[i] = 0;
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- hist[img.at<uchar>(i, j)]++;
- return hist;
- }
- /* 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 4
- bool onContour(int r, int g, int b, int i, int j, Mat* src){
- int posi, posj;
- posi = i - 1;
- posj = j - 1;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- posi = i - 1;
- posj = j;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- posi = i - 1;
- posj = j + 1;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- posi = i;
- posj = j - 1;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- posi = i;
- posj = j + 1;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- posi = i + 1;
- posj = j - 1;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- posi = i + 1;
- posj = j;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- posi = i + 1;
- posj = j + 1;
- if ((*src).at<Vec3b>(posi, posj)[0] != b || (*src).at<Vec3b>(posi, posj)[1] != g || (*src).at<Vec3b>(posi, posj)[2] != r)
- return true;
- return false;
- }
- void toateOperatiile(int r, int g, int b, Mat* src) {
- int area = 0, ri = 0, ci = 0, perim = 0, e1 = 0, e2 = 0, e3 = 0;
- int rmax = -1000, rmin = 1000, cmax = -1000, cmin = 1000;
- for (int i = 0; i < (*src).rows; i++)
- for (int j = 0; j < (*src).cols; j++)
- if (((*src).at<Vec3b>(i, j).val[0] == b) && ((*src).at<Vec3b>(i, j).val[1] == g) && ((*src).at<Vec3b>(i, j).val[2] == r)) {
- if (i > rmax)
- rmax = i;
- else if (i < rmin)
- rmin = i;
- if (j > cmax)
- cmax = j;
- else if (j < cmin)
- cmin = j;
- ri += i;
- ci += j;
- area++;
- }
- ri /= area;
- ci /= area;
- for (int i = 0; i < (*src).rows; i++)
- for (int j = 0; j < (*src).cols; j++)
- if (((*src).at<Vec3b>(i, j).val[0] == b) && ((*src).at<Vec3b>(i, j).val[1] == g) && ((*src).at<Vec3b>(i, j).val[2] == r))
- if (onContour(r, g, b, i, j, src))
- perim++;
- for (int i = 0; i < (*src).rows; i++)
- for (int j = 0; j < (*src).cols; j++)
- if (((*src).at<Vec3b>(i, j).val[0] == b) && ((*src).at<Vec3b>(i, j).val[1] == g) && ((*src).at<Vec3b>(i, j).val[2] == r)) {
- e1 += (i - ri) * (j - ci);
- e2 += (j - ci) * (j - ci);
- e3 += (i - ri) * (i - ri);
- }
- float phi = atan2(2 * e1, (e2 - e3)) / 2;
- float thinness = 4 * PI * area / perim * perim;
- float aspectRatio = (cmax - cmin + 1) / (rmax - rmin + 1);
- printf("Aria: %d\nCentru de masa: %d, %d\nAxa de alungire: %f\nPerimetru: %d\nFactor de subtiere: %f\nFactor de aspect: %f\n",
- area, ri, ci, phi * 180 / PI, perim, thinness, aspectRatio);
- }
- 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("\nPozitie(x,y): %d, %d\nColor(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]);
- toateOperatiile((*src).at<Vec3b>(y, x)[2], (*src).at<Vec3b>(y, x)[1], (*src).at<Vec3b>(y, x)[0], src);
- }
- }
- 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);
- }
- }
- //lab5
- void drawLabels(){
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(src.size(), CV_8UC3);
- int label = 0;
- Mat tLabels = Mat::zeros(src.size(), CV_8UC1);
- for (int i = 1; i < tLabels.rows - 1; i++)
- for (int j = 1; j < tLabels.cols - 1; j++)
- if (src.at<uchar>(i, j) == 0 && tLabels.at<uchar>(i, j) == 0) {
- label++;
- std::queue<Point> Q;
- Point p = Point(i, j);
- tLabels.at<uchar>(i, j) = label;
- Q.push(p);
- while (!Q.empty()) {
- Point q = Q.front();
- Q.pop();
- for (int k = q.x - 1; k <= q.x + 1; k++) //pt fiecare vecin din N8
- for (int l = q.y - 1; l <= q.y + 1; l++) {
- Point vecin = Point(k, l);
- if (src.at<uchar>(vecin.x, vecin.y) == 0 && tLabels.at<uchar>(vecin.x, vecin.y) == 0 && k != q.x&&l != q.y) {
- tLabels.at<uchar>(vecin.x, vecin.y) = label;
- Q.push(vecin);
- }
- }
- }
- }
- Vec3b * culori = (Vec3b*)malloc((label + 1)*sizeof(Vec3b));
- for (int i = 1; i <= label; i++) {
- unsigned char R = rand() % 255;
- unsigned char G = rand() % 255;
- unsigned char B = rand() % 255;
- culori[i] = Vec3b(B, G, R);
- }
- for (int i = 0; i < tLabels.rows; i++)
- for (int j = 0; j < tLabels.cols; j++) {
- int pozVec = tLabels.at<uchar>(i, j);
- if (pozVec == 0)
- dest.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
- else
- dest.at<Vec3b>(i, j) = culori[pozVec];
- }
- imshow("src image", src);
- imshow("dest image", dest);
- waitKey(0);
- }
- }
- int maxi1(int x, int y) {
- return x > y ? x : y;
- }
- int mini(int x, int y) {
- return x < y ? x : y;
- }
- void traversalTwoPass() {
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("image", src);
- Mat dst = Mat(src.size(), CV_8UC3);
- int height = src.rows;
- int width = src.cols;
- int label = 0;
- vector< vector<int> > labels(height, vector<int>(width));
- vector< vector<int> > edges(100000);//assoc
- for (int i = 1; i < height - 1; i++)
- for (int j = 1; j <width - 1; j++) {
- //if not visited
- if (src.data[i*src.step[0] + j] == 0 && labels[i][j] == 0) {
- vector<int> L;
- for (int t = maxi1(i - 1, 0); t <= mini(i + 1, height - 1); t++)
- for (int u = maxi1(j - 1, 0); u <= mini(j + 1, width - 1); u++)
- if (labels[t][u] > 0)
- L.push_back(labels[t][u]);
- if (L.size() == 0) {
- label++;
- labels[i][j] = label;
- }
- else {
- int x = L[0];
- for (int q = 1; q < L.size(); q++)
- if (L[q] < x)
- x = L[q];
- labels[i][j] = x;
- for (int q = 0; q < L.size(); q++) {
- int y = L[q];
- if (y != x) {
- edges[x].push_back(y);
- edges[y].push_back(x);
- }
- }
- }
- }
- }
- int newlabel = 0;
- vector<int> newlabels(label + 1);
- for (int i = 1; i <= label; i++)
- if (newlabels[i] == 0) {
- newlabel++;
- std::queue<int> q;
- newlabels[i] = newlabel;
- q.push(i);
- while (!q.empty()) {
- int x = q.front();
- q.pop();
- for (int t = 0; t < edges[x].size(); t++)
- if (newlabels[edges[x][t]] == 0) {
- newlabels[edges[x][t]] = newlabel;
- q.push(edges[x][t]);
- }
- }
- }
- //generate colors
- Vec3b color[200000];
- for (int i = 1; i <= newlabel; i++) {
- color[i][0] = rand() % 255;
- color[i][1] = rand() % 255;
- color[i][2] = rand() % 255;
- }
- for (int i = 0; i<height; i++)
- for (int j = 0; j < width; j++)
- if (src.data[i*src.step[0] + j] == 0)
- dst.at<Vec3b>(i, j) = color[newlabels[labels[i][j]]];
- //labels color
- imshow("destinatie", dst);
- waitKey();
- }
- }
- //lab6
- FILE *f;
- void findContour() {
- int t = 7;
- FILE *f = fopen("output.txt", "w");
- if (f == NULL) {
- printf("Error opening file!\n");
- exit(1);
- }
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("imagine initiala", src);
- Mat dst(src.rows, src.cols, CV_8UC1);
- std::vector<my_point> contur;
- int n = 0; // indice curent din vector contur
- int dir = 7;
- int x, y;
- int dj[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- int di[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- int I = 0, J = 0;
- for (int i = 0; i < src.rows; i++)
- for (int j = 0; j < src.cols; j++)
- dst.at<uchar>(i, j) = 255;
- // start
- bool ok = false;
- for (int i = 0; (i < src.rows) && (!ok); i++)
- for (int j = 0; (j < src.cols) && (!ok); j++)
- if (src.at<uchar>(i, j) == 0) {
- dst.at<uchar>(i, j) = 0;
- contur.push_back(my_point{ i, j, 7 });
- I = i;
- J = j;
- ok = true;
- }
- dst.at<uchar>(I, J) = 0;
- bool finished = false;
- int d = 0;
- while (!finished) {
- // directia initiala pt cautarea urmatorului pixel
- if (dir % 2 == 0)
- dir = (dir + 7) % 8;
- else
- dir = (dir + 6) % 8;
- int l = 0;
- // cauta urmator pixel
- for (int k = 0; k < 8; k++) {
- d = (dir + k) % 8;
- x = I + di[d];
- y = J + dj[d];
- l++;
- if (src.at<uchar>(x, y) == 0) {
- dir = d;
- dst.at<uchar>(x, y) = 0;
- //std::cout << x << " " << y << " " << dir << " " << std::endl;
- fprintf(f, "%d %d %d ", x, y, dir);
- if (n > 0){
- t = contur[n].c - contur[n - 1].c;
- fprintf(f, "%d\n", l);
- }
- else fprintf(f, "%d %d\n", contur[n].c, t);
- contur.push_back(my_point{ x, y, dir });
- I = x;
- J = y;
- n++;
- break;
- }
- }
- if ((n > 1))
- if ((contur[0].x == contur[n - 1].x) && (contur[1].x == contur[n].x) &&
- (contur[0].y == contur[n - 1].y) && (contur[1].y == contur[n].y))
- finished = true;
- }
- fclose(f);
- imshow("Contur", dst);
- waitKey();
- }
- }
- void reconstruct() {
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int dj[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- int di[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- FILE* fp = fopen("reconstruct.txt", "r");
- if (!fp)
- printf("Error opening the text file !\n");
- int x_start, y_start, nr;
- fscanf(fp, "%d%d%d", &x_start, &y_start, &nr);
- printf("%d, %d, %d\n", x_start, y_start, nr);
- src.at<uchar>(x_start, y_start) = 0;
- int k;
- while (nr != 0) {
- fscanf(fp, "%d", &k);
- x_start += di[k];
- y_start += dj[k];
- src.at<uchar>(x_start, y_start) = 0;
- nr--;
- }
- imshow("input image", src);
- waitKey();
- }
- }
- // lab 7
- Mat dilatare(Mat src) {
- Mat dst = src.clone();
- int dj[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- int di[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- for (int i = 1; i < src.rows - 1; i++)
- for (int j = 1; j < src.cols - 1; j++)
- if (src.at<uchar>(i, j) == FG)
- for (int k = 0; k < 8; k++)
- dst.at<uchar>(i + di[k], j + dj[k]) = FG;
- return dst;
- }
- void testDilatare() {
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("src", img);
- imshow("dilatare", dilatare(img));
- waitKey(0);
- }
- }
- Mat eroziune(Mat src) {
- Mat dst = src.clone();
- int dj[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- int di[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- for (int i = 1; i < src.rows - 1; i++)
- for (int j = 1; j < src.cols - 1; j++)
- if (src.at<uchar>(i, j) == FG)
- for (int k = 0; k < 8; k++)
- if (src.at<uchar>(i + di[k], j + dj[k]) == BG) {
- dst.at<uchar>(i, j) = BG;
- break;
- }
- return dst;
- }
- void testEroziune() {
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("src", img);
- imshow("eroziune", eroziune(img));
- waitKey(0);
- }
- }
- Mat deschidere(Mat src) {
- Mat temp = src.clone();
- temp = eroziune(src);
- Mat dst = temp.clone();
- dst = dilatare(temp);
- imshow("DESCHIDERE - src", src);
- imshow("DESCHIDERE - temp", temp);
- imshow("DESCHIDERE - dst", dst);
- return dst;
- }
- void testDeschidere(){
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- deschidere(img);
- waitKey(0);
- }
- }
- Mat inchidere(Mat src) {
- Mat temp = src.clone();
- temp = dilatare(src);
- Mat dst = temp.clone();
- dst = eroziune(temp);
- imshow("INCHIDERE - src", src);
- imshow("INCHIDERE - temp", temp);
- imshow("INCHIDERE - dst", dst);
- return dst;
- }
- void testInchidere() {
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- inchidere(img);
- waitKey(0);
- }
- }
- // lab 8
- void calcule(Mat img){
- // nr de pixeli ai imaginii
- int M = img.rows * img.cols;
- int* hist = calculHistograma(img);
- showHistogram("histogram", hist, 256, 200);
- // niv maxim de intensitate
- int L = 255;
- // niveluri de gri
- float fdp[256] = {};
- for (int g = 0; g <= L; g++)
- fdp[g] = (float)hist[g] / M;
- // val medie a niv de intensitate
- float medie = 0.0;
- for (int g = 0; g <= L; g++)
- medie += fdp[g] * g;
- // deviatie standard
- float devStd = 0.0;
- for (int g = 0; g <= L; g++)
- devStd += pow(g - medie, 2) * fdp[g];
- devStd = sqrt(devStd);
- printf("Valoare medie: %f.\n", medie);
- printf("Deviatie standard: %f.\n", devStd);
- }
- void testHistogramaFDP() {
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("src", img);
- calcule(img);
- waitKey(0);
- }
- }
- void pragBinarizare(Mat img){
- // nr de pixeli ai imaginii
- int M = img.rows * img.cols;
- int* hist = calculHistograma(img);
- showHistogram("histogram", hist, 256, 200);
- // fdp
- float fdp[256] = {};
- for (int g = 0; g < 256; g++)
- fdp[g] = (float)hist[g] / M;
- float T;
- int iMin = 0, iMax = 256;
- T = (iMax + iMin) / 2.0;
- float Tn_1;
- do
- {
- int Nmic = 0, Nmare = 0;
- float medieMica = 0, medieMare = 0;
- for (int g = 0; g <= T; g++)
- Nmic += hist[g];
- for (int g = 255; g > T; g--)
- Nmare += hist[g];
- for (int g = 0; g <= T; g++)
- medieMica += hist[g] * g;
- for (int g = 255; g > T; g--)
- medieMare += hist[g] * g;
- Tn_1 = T;
- T = (medieMica / Nmic + medieMare / Nmare) / 2.0;
- } while (abs(Tn_1 - T) > 0.1);
- printf("Prag de binarizare: %f.\n", T);
- Mat dest = img.clone();
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- if (img.at<uchar>(i, j) < 165)
- dest.at<uchar>(i, j) = 0;
- else
- dest.at<uchar>(i, j) = 255;
- imshow("Binarizare", dest);
- }
- void testPragBinarizare(){
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("src", img);
- pragBinarizare(img);
- waitKey(0);
- }
- }
- void calculeHisto(Mat img){
- imshow("Src", img);
- showHistogram("src", calculHistograma(img), 256, 200);
- // negativ
- Mat neg = img.clone();
- int L = 255;
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- neg.at<uchar>(i, j) = L - img.at<uchar>(i, j);
- imshow("Negativ", neg);
- showHistogram("negativ", calculHistograma(neg), 256, 200);
- // luminozitate
- Mat lum = img.clone();
- int offset = 50;
- printf("Luminozitate: offset = %d\n", offset);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- int aux = img.at<uchar>(i, j) + offset;
- if (aux > 255)
- aux = 255;
- if (aux < 0)
- aux = 0;
- lum.at<uchar>(i, j) = aux;
- }
- imshow("Luminozitate", lum);
- showHistogram("luminozitate", calculHistograma(lum), 256, 200);
- // corectia gamma
- Mat gam = img.clone();
- float gamma = 2;
- printf("Corectie gamma: gamma = %f\n", gamma);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- float aux = pow((float)img.at<uchar>(i, j) / 255, gamma) * 255;
- if (aux > 255)
- aux = 255;
- if (aux < 0)
- aux = 0;
- gam.at<uchar>(i, j) = (int)aux;
- }
- imshow("Corectia gamma", gam);
- showHistogram("gamma", calculHistograma(gam), 256, 200);
- // modificarea contrastului
- int gmin = 255;
- int gmax = 0;
- int gOUTmin = 15, gOUTmax = 200;
- int* hist = calculHistograma(img);
- for (int i = 0; i < 255; i++) {
- if (hist[i] != 0 && i < gmin)
- gmin = i;
- if (hist[i] != 0 && i > gmax)
- gmax = i;
- }
- Mat contrast = img.clone();
- printf("Contrast:\n");
- printf("G in min = %d\n", gmin);
- printf("G in max = %d\n", gmax);
- printf("G out min = %d\n", gOUTmin);
- printf("G out max = %d\n", gOUTmax);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- float aux = gOUTmin + (img.at<uchar>(i, j) - gmin) * (gOUTmax - gOUTmin) / (gmax - gmin);
- if (aux > 255)
- aux = 255;
- if (aux < 0)
- aux = 0;
- contrast.at<uchar>(i, j) = (int)aux;
- }
- imshow("Contrast", contrast);
- showHistogram("contrast", calculHistograma(contrast), 256, 200);
- }
- void testCalculeHisto(){
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("src", img);
- calculeHisto(img);
- waitKey(0);
- }
- }
- void egalizareHisto(Mat img){
- int *hist = calculHistograma(img);
- showHistogram("histogram SRC", hist, 256, 200);
- int hc[256] = {};
- int tab[256] = {};
- hc[0] = 0;
- for (int g = 1; g < 256; g++)
- hc[g] = hc[g - 1] + hist[g];
- Mat dst = img.clone();
- int M = img.rows * img.cols;
- for (int g = 0; g < 256; g++)
- tab[g] = 255 * hc[g] / M;
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- dst.at<uchar>(i, j) = tab[img.at<uchar>(i, j)];
- int *histDst = calculHistograma(dst);
- imshow("dst", dst);
- showHistogram("histogram DST", histDst, 256, 200);
- }
- void testEgalizareHisto(){
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("src", img);
- egalizareHisto(img);
- waitKey(0);
- }
- }
- 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 - Negative image\n");
- printf(" 8 - Change color\n");
- printf(" 9 - Add\n");
- printf(" 10 - Mul\n");
- printf(" 11 - Create\n");
- printf(" 12 - Invert\n");
- printf(" 13 - Change 3 in 1\n");
- printf(" 14 - Color to gray\n");
- printf(" 15 - Gray to white and black\n");
- printf(" 16 - RGB to HSV\n");
- printf(" 17 - L3 - Histogram\n");
- printf(" 18 - L4 - Trasaturi geometrice\n");
- printf(" 19 - L5 - Draw labels\n");
- printf(" 20 - L5 - Traversare 2Pass\n");
- printf(" 21 - L6 - Contur\n");
- printf(" 22 - L6 - Reconstruire contur\n");
- printf(" 23 - L7 - Dilatare\n");
- printf(" 24 - L7 - Eroziune\n");
- printf(" 25 - L7 - Deschidere\n");
- printf(" 26 - L7 - Inchidere\n");
- printf(" 23 - L7 - Dilatare\n");
- printf(" 24 - L7 - Eroziune\n");
- printf(" 25 - L7 - Deschidere\n");
- printf(" 26 - L7 - Inchidere\n");
- printf(" 27 - L8 - Histo FDP\n");
- printf(" 28 - L8 - Binarizare\n");
- printf(" 29 - L8 - Calcule histo\n");
- printf(" 30 - L8 - Egalizare histo\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:
- negative_img();
- break;
- case 8:
- changeColor();
- break;
- case 9:
- add();
- break;
- case 10:
- mul();
- break;
- case 11:
- create();
- break;
- case 12:
- invert();
- break;
- case 13:
- changeColor3in1();
- break;
- case 14:
- colorToGray();
- break;
- case 15:
- grayToWB();
- break;
- case 16:
- RGBtoHSV();
- break;
- case 17:
- showHistogram("MyHist", calculHistograma(imread("Images/cameraman.bmp", CV_LOAD_IMAGE_GRAYSCALE)), 255, 200);
- break;
- case 18:
- testMouseClick();
- break;
- case 19:
- drawLabels();
- break;
- case 20:
- traversalTwoPass();
- break;
- case 21:
- findContour();
- break;
- case 22:
- reconstruct();
- break;
- case 23:
- testDilatare();
- break;
- case 24:
- testEroziune();
- break;
- case 25:
- testDeschidere();
- break;
- case 26:
- testInchidere();
- break;
- case 27:
- testHistogramaFDP();
- break;
- case 28:
- testPragBinarizare();
- break;
- case 29:
- testCalculeHisto();
- break;
- case 30:
- testEgalizareHisto();
- break;
- }
- } while (op != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment