Learn openCV.pdf
qmake: link with opencv (Key Point)
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = displayimage
TEMPLATE = app INCLUDEPATH += /usr/local/include/opencv
LIBS += -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui SOURCES += main.cpp\
mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui
main.cpp
#include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp> //add MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
cv::Mat inputImage = cv::imread("/home/unsw/Pictures/me/lolo.JPG"); //add
cv::imshow("Display Image", inputImage); //add
} MainWindow::~MainWindow()
{
delete ui;
}
ch2_ex2_1: 打开并显示图片
#include "highgui.h" int main( int argc, char** argv )
{
// IplImage* img = cvLoadImage( argv[1] );
IplImage* img = cvLoadImage( "/home/unsw/Pictures/me/lolo.JPG",
CV_WINDOW_AUTOSIZE); cvNamedWindow("lolo", CV_WINDOW_FREERATIO);
cvShowImage("lolo", img );
cvWaitKey();
cvReleaseImage( &img );
cvDestroyWindow("lolo");
}
ch2_ex2_2: 打开并显示视频
int main( int argc, char** argv ) {
cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );
//CvCapture* capture = cvCaptureFromAVI( argv[1] ); // either one will work
CvCapture* capture = cvCreateFileCapture( "/home/unsw/test.avi" ); // 放每一帧的buf
IplImage* frame;
while() {
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "Example2", frame ); //不需要手动释放,capture的释放即顺便将其释放
char c = cvWaitKey(); //33ms, 30frames per second.
if( c == ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Example2" );
}
ch2_ex2_3: 打开并显示视频 + Control Bar
可以使用QT的图形界面控制,非重点here。
ch2_ex2_4: 平滑处理图片
#include "cv.h"
#include "highgui.h" void example2_4( IplImage* image )
{
// Create some windows to show the input
// and output images in.
//
cvNamedWindow( "Example2_4-in", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "Example2_4-out", CV_WINDOW_AUTOSIZE ); // Create a window to show our input image
//
cvShowImage( "Example2_4-in", image ); // Create an image to hold the smoothed output
//
IplImage* out = cvCreateImage(
cvGetSize(image),
IPL_DEPTH_8U, ); // Do the smoothing
//
cvSmooth( image, out, CV_GAUSSIAN, ,5,0,0 );
cvSmooth( out, out, CV_GAUSSIAN, ,5,0,0); // Show the smoothed image in the output window
//
cvShowImage( "Example2_4-out", out ); // Be tidy
//
cvReleaseImage( &out ); // Wait for the user to hit a key, then clean up the windows
//
cvWaitKey( );
cvDestroyWindow("Example2_4-in" );
cvDestroyWindow("Example2_4-out" ); } int main( int argc, char** argv )
{
IplImage* img = cvLoadImage( argv[] );
cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE );
cvShowImage("Example1", img );
example2_4( img );
// cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow("Example1");
}
ch2_ex2_8: 灰度化(Gray) --> 缩小图片(Pyr) --> 线条化(Canny)
#include "cv.h"
#include "highgui.h" IplImage* doCanny(
IplImage* in,
double lowThresh,
double highThresh,
double aperture)
{
IplImage* out = cvCreateImage(
cvGetSize( in ),
in->depth, //IPL_DEPTH_8U,
);
cvCanny( in, out, lowThresh, highThresh, aperture );
return( out );
}; IplImage* doPyrDown(
IplImage* in,
int filter = IPL_GAUSSIAN_5x5)
{ // Best to make sure input image is divisible by two.
//
assert( in->width% == && in->height% == ); IplImage* out = cvCreateImage(
cvSize( in->width/, in->height/ ),
in->depth,
in->nChannels
);
cvPyrDown( in, out );
return( out );
}; int main( int argc, char** argv )
{
cvNamedWindow("Example Gray", CV_WINDOW_AUTOSIZE );
cvNamedWindow("Example Pyr", CV_WINDOW_AUTOSIZE );
cvNamedWindow("Example Canny", CV_WINDOW_AUTOSIZE );
IplImage* img_rgb = cvLoadImage( "/home/unsw/lolo.jpg" );
IplImage* out; out = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, );
cvCvtColor(img_rgb, out ,CV_BGR2GRAY);
cvShowImage("Example Gray", out );
out = doPyrDown( out );
out = doPyrDown( out );
cvShowImage("Example Pyr", out );
out = doCanny( out, , , );
cvShowImage("Example Canny", out ); cvWaitKey();
cvReleaseImage( &out);
cvDestroyWindow("Example Gray");
cvDestroyWindow("Example Pyr");
cvDestroyWindow("Example Canny");
}
ch2_ex2_9: Camera: Preview & Capture
#include "cv.h"
#include "highgui.h" int main( int argc, char** argv ) {
cvNamedWindow( "Example2_9", CV_WINDOW_AUTOSIZE );
CvCapture* capture;
if (argc==) {
capture = cvCreateCameraCapture( );
} else {
capture = cvCreateFileCapture( argv[] );
}
assert( capture != NULL ); IplImage* frame;
while() {
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "Example2_9", frame );
char c = cvWaitKey(4);
if( c == ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Example2_9" );
}
ch2_ex2_10: 写入视频文件
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <iostream> using namespace std; // Convert a video to grayscale
// argv[1]: input video file
// argv[2]: name of new output file
// //#define NOWRITE 1; //Turn this on (removed the first comment out "//" if you can't write on linux main( int argc, char* argv[] ) {
cvNamedWindow( "Example2_10", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "Log_Polar", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateFileCapture( "/home/unsw/test.avi" );
if (!capture){
return -;
}
IplImage* bgr_frame;
double fps = cvGetCaptureProperty (
capture,
CV_CAP_PROP_FPS
);
printf("fps=%d\n",(int)fps); CvSize size = cvSize(
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT)
); printf("frame (w, h) = (%d, %d)\n",size.width,size.height);
#ifndef NOWRITE
CvVideoWriter* writer = cvCreateVideoWriter( // On linux Will only work if you've installed ffmpeg development files correctly,
"/home/unsw/test_out.avi", // otherwise segmentation fault. Windows probably better.
CV_FOURCC('D','X','',''),
fps,
size
);
#endif
IplImage* logpolar_frame = cvCreateImage(
size,
IPL_DEPTH_8U, ); IplImage* gray_frame = cvCreateImage(
size,
IPL_DEPTH_8U, ); while( (bgr_frame=cvQueryFrame(capture)) != NULL ) {
cvShowImage( "Example2_10", bgr_frame );
cvConvertImage( //We never make use of this gray image
bgr_frame,
gray_frame,
CV_RGB2GRAY
);
cvLogPolar( bgr_frame, logpolar_frame, //This is just a fun conversion the mimic's the human visual system
cvPoint2D32f(bgr_frame->width/,
bgr_frame->height/),
,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
cvShowImage( "Log_Polar", logpolar_frame );
//Sigh, on linux, depending on your ffmpeg, this often won't work ...
#ifndef NOWRITE
cvWriteToAVI( writer, logpolar_frame );
#endif
char c = cvWaitKey();
if( c == ) break;
}
#ifndef NOWRITE
cvReleaseVideoWriter( &writer );
#endif
cvReleaseImage( &gray_frame );
cvReleaseImage( &logpolar_frame );
cvReleaseCapture( &capture );
}