Deo inventara foruma
Član od: 10.11.2007.
Lokacija: Moskva
Poruke: 4.760
Zahvalnice: 2.120
Zahvaljeno 786 puta na 496 poruka
Pomoć oko zadatka OpenCV,visual studio
Narode imam problem.Dobio sam zadatak da odradim u kome treba
(1): da učitam video sekvencu preko kamere i konvertujem iz RGB u YUV gde se dalje radi na Y komponenti a U i V se ne diraju,
(2) zatim detekcija ivica u sakom frejmu gde se ivice proračunavaju preko sopstveno implementirane funkcije Gaussian of Laplacian i Canny edge detection potrebno je za oba slučaja prikazati imshow rezultate.
(3) Potrebno je pooštriti sliku,Y komponenta ulazne slike se obrađuje preko low pass filtra i high pass filtra,Kerneli se mogu proizvoljno odabrati i primeniti konvolucija.
(4) Aktivirati jedan frejm ulazne sekvence i konačne izlazne i generisati njihove histograme Z komponente.
E sad Deo sa ivicama (2) sam odradio,ali bez Laplacian-a.Kod za taj deo:
Spoiler za main.cpp:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // Otvaranje kamere
if(!cap.isOpened()) // Provera
return -1;
Mat edges;
namedWindow("Kamera Ivice",1);
for(;
{
Mat frame;
cap >> frame;
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,5), 1.5, 1.5);
imshow("Gaussian",edges); // Prozor Gaussian (Stavka 2)
Canny(edges, edges, 0, 30, 3);
imshow("Ivice", edges); // Prozor Canny Edge Detection (Stavka 2)
if(waitKey(30) >= 0) break;
}
return 0;
}
Prvi deo zadatka sam pokušavao da radim na 100 različitih načina,ali bez uspeha,u principu kada loadujem sliku kod bi izgledao ovako:
Spoiler za Main.cpp:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
#include "fun.h"
const string windowName = "Histogram Ekvilizacija";
const string windowName1 = "Tone Mapping";
int main(int argc, char *argv[])
{
namedWindow(windowName, CV_WINDOW_AUTOSIZE);
namedWindow(windowName1, CV_WINDOW_AUTOSIZE);
namedWindow("InputImage", CV_WINDOW_AUTOSIZE);
Mat inImage = imread("bla bla.jpg");
Mat inImageYUV, inImageYUVp, inImagep, inImagepOF;
imshow("InputImage",inImage);
FILE *fp = fopen("hist.txt","w");
int *hist = new int[256];
for(int i=0;i<256;i++) hist[i]=0;
cvtColor(inImage, inImageYUV, CV_RGB2YCrCb);
computeHistogram(inImageYUV,hist,fp);
Mat outImageYUV = inImageYUV.clone();
enhancementContrast(inImageYUV,outImageYUV);
FILE *fpo1 = fopen("histo1.txt","w");
int *histo1 = new int[256];
for(int i=0;i<256;i++) histo1[i]=0;
computeHistogram(outImageYUV,histo1,fpo1);
vector<Mat> yuv_planesIn;
vector<Mat> yuv_planesOut;
split( inImageYUV, yuv_planesIn );
Mat src = yuv_planesIn[0];
Mat dst;
equalizeHist(src, dst);
yuv_planesOut.push_back(dst);
yuv_planesOut.push_back(yuv_planesIn[1]);
yuv_planesOut.push_back(yuv_planesIn[2]);
merge(yuv_planesOut,inImageYUVp);
FILE *fpo2 = fopen("histo2.txt","w");
int *histo2 = new int[256];
for(int i=0;i<256;i++) histo2[i]=0;
computeHistogram(inImageYUVp,histo2,fpo2);
cvtColor(inImageYUVp, inImagep, CV_YCrCb2RGB);
cvtColor(outImageYUV, inImagepOF, CV_YCrCb2RGB);
imshow(windowName,inImagep);
imshow(windowName1,inImagepOF);
waitKey(0);
destroyWindow(windowName);
fclose(fp);
delete [] hist;
fclose(fpo1);
delete [] histo1;
fclose(fpo2);
delete [] histo2;
}
Spoiler za fun.cpp:
#include "fun.h"
void computeHistogram(Mat inImageYUV,int *hist,FILE *fp){
int width = inImageYUV.cols;
int height = inImageYUV.rows;
int val;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
val = inImageYUV.at<Vec3b>(j,i).val[0];
hist[val]++;
}
for(int c = 0;c<255;c++) fprintf(fp,"%d \n",hist[c]);
}
void enhancementContrast(Mat inImageYUV,Mat &outImageYUV){
int width = inImageYUV.cols;
int height = inImageYUV.rows;
double a1 = Y1/X1;
double b1 = 0.;
double a2 = (Y2-Y1)/(X2-X1);
double b2 = Y1-a2*X1;
double a3 = (Y3-Y2)/(X3-X2);
double b3 = Y2-a3*X2;
int val;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
val = inImageYUV.at<Vec3b>(j,i).val[0];
if(val<X1){
outImageYUV.at<Vec3b>(j,i).val[0] = (int)(a1*(double)val + b1);
}
else if(val<X2){
outImageYUV.at<Vec3b>(j,i).val[0] = (int)(a2*(double)val + b2);
}
else if(val<X3){
outImageYUV.at<Vec3b>(j,i).val[0] = (int)(a3*(double)val + b3);
}
}
}
Do dela 3 i 4 nisam ni stigao očigledno,ali bi mi pomoć oko dela 1 i 2 dobro došla.