opencv教程

OpenCV 2.4 API

OpenCV安装

  1. VC 2010下安装OpenCV2.4.4
  2. How to build applications with OpenCV inside the Microsoft Visual Studio

cvCreateImage(opencv 1.0)

IplImage* cvCreateImage(CvSize cvSize(int width, int height), int depth, int channels);

depth:
IPL_DEPTH_8U - 8位无符号整数
IPL_DEPTH_8S - 8位符号整数
IPL_DEPTH_16U - 16位无符号整数
IPL_DEPTH_16S - 16位符号整数
IPL_DEPTH_32S - 32位符号整数
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数

channels:
1 / 2 / 3 / 4

参考文档cvCreateImage函数说明

crop image(剪裁图片)

opencv 2.0:

#include <opencv2/opencv.hpp>
#include <highgui.h>

int main(int argc, char* argv[])
{
    cv::Mat img = cv::imread(argv[1]);
    if (img.empty())
    {
        std::cout << "!!! imread() failed to open target image" << std::endl;
        return -1;        
    }

    /* Set Region of Interest */

    int offset_x = 129;
    int offset_y = 129;

    cv::Rect roi;
    roi.x = offset_x;
    roi.y = offset_y;
    roi.width = img.size().width - (offset_x*2);
    roi.height = img.size().height - (offset_y*2);

    /* Crop the original image to the defined ROI */

    cv::Mat crop = img(roi);
    cv::imshow("crop", crop);
    cv::waitKey(0);

    cv::imwrite("noises_cropped.png", crop);

    return 0;
}

opencv 1.0:

	cvNamedWindow("Example", CV_WINDOW_AUTOSIZE);

	IplImage* imagergb = cvLoadImage("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	CvRect drawRect = cvRect(100,100,200,200);
	cvSetImageROI(imagergb, drawRect);
    
	IplImage* img_roi =	cvCreateImage(cvSize(drawRect.width, drawRect.height), IPL_DEPTH_8U, 1);
	cvCopy(imagergb, img_roi);
    
	cvShowImage("Example", img_roi);
	cvWaitKey(0);

	cvResetImageROI(imagergb);
	cvShowImage("Example3", imagergb);
	cvWaitKey(0);
    
	cvReleaseImage(&imagergb);
	cvReleaseImage(&img_roi);
	cvDestroyWindow("Example");

参考文档

crop video(视频裁剪)

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "cxvideocap.hpp"

bool cropVideo(const char* videoname, CvRect dstRect_) {
	CxVideoReader capture_;
	if(capture_.load(videoname) == false ) {
		std::cout << "InitCapture: failed to load video" << std::endl;
		return false;
	}

	std::string filename = videoname;
	filename.erase(filename.rfind('.')); // rfind(".mov")
	filename.append("_crop.avi");
	CxVideoWriter* writer_ = new CxVideoWriter(filename.c_str(),
		capture_.fps(),
		CV_FOURCC('D', 'I', 'V', 'X'));

	IplImage* frame = capture_.query();
	while(!(nullptr == frame || capture_.eof())) {

		/* transpose and mirror(flip) to rotate 90 degree */
		IplImage* img =	nullptr;
		if (frame->width > frame->height) {
			img = cvCreateImage(cvSize(frame->height, frame->width), IPL_DEPTH_8U, 3);
			cvTranspose(frame, img);
		} else {
			img = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
			cvCopy(frame,img);
		}
		cvMirror(img, img, 1);

		/* reset realityRect to make width equal to height */
		CvRect realityRect = dstRect_;
		if (dstRect_.width > dstRect_.height) {
			realityRect.height = dstRect_.width;
			realityRect.y = dstRect_.y - (abs(dstRect_.height - dstRect_.width) >> 1);
			realityRect.y = realityRect.y > 0 ? realityRect.y : 0;
		} else {
			realityRect.width = dstRect_.height;
			realityRect.x = dstRect_.x - (abs(dstRect_.height - dstRect_.width) >> 1);
			realityRect.x = realityRect.x > 0 ? realityRect.x : 0;
		}

		/* reset realityRect according to processed frame */
		if (realityRect.x + realityRect.width > img->width) {
			realityRect.width = img->width - realityRect.x;
		}
		if (realityRect.y + realityRect.height > img->height) {
			realityRect.height = img->height - realityRect.y;
		}

		cvSetImageROI(img, realityRect);
		IplImage* img_roi =	cvCreateImage(cvSize(realityRect.width, realityRect.height), IPL_DEPTH_8U, 3);
		cvCopy(img, img_roi);

		int crop_w_h = (realityRect.width > realityRect.height) ? realityRect.width : realityRect.height;
		IplImage* crop_d =	cvCreateImage(cvSize(crop_w_h, crop_w_h), IPL_DEPTH_8U, 3);

		int x = realityRect.width > realityRect.height ? 0 : (realityRect.height-realityRect.width)>>1;
		int y = realityRect.width > realityRect.height ? (realityRect.width-realityRect.height)>>1 : 0;
		CvRect drawRect = cvRect(x, y, realityRect.width, realityRect.height);
		cvSetImageROI(crop_d, drawRect);
		memset(crop_d->imageData, 0, crop_d->imageSize);
		cvCopy(img_roi, crop_d);

		cvResetImageROI(crop_d);
		writer_->write(crop_d);

		cvReleaseImage(&img);
		cvReleaseImage(&img_roi);
		cvReleaseImage(&crop_d);

		frame = capture_.query();
	}

	capture_.release();

	if (nullptr != writer_)
		delete writer_;

	return true;
}

cvResize函数图象放缩

void cvResize(
  const CvArr* src,
  CvArr* dst,
  Int interpolation = CV_INTER_LINEAR
);

CV_INTER_NN                 含义:最近邻插值
CV_INTER_LINER              含义:双线性插值
CV_INTER_AREA               含义:区域插值
CV_INTER_CUBIC              含义:三次样条插值

一般情况下,我们期望源图像和重采样后的目标图像之间的映射尽可能地平滑。参数interpolation就是控制如何进行映射。当缩小图像时,目标图像的像素会映射为源图像中的多个参数,这时需要进行插值。当放大图像时,目标图像上的像素可能无法在源图像中找到精确对应的像素,也需要进行插值。最简单的方法试将目标图像各点的像素值设为源图像中与其距离最近的像素值,这就是当interpolation设为CV_INTER_NN时用的算法。

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main(int argc, char** argv) {  
    IplImage *src = cvLoadImage("icon.png");  
    IplImage *desc;  
    CvSize sz;  
    double scale = 0.5;  
    if(src) {
        sz.width = src->width*scale;  
        sz.height = src->height*scale;  
        desc = cvCreateImage(sz,src->depth,src->nChannels);  
        cvResize(src,desc,CV_INTER_CUBIC);  
        cvNamedWindow("src",CV_WINDOW_AUTOSIZE);  
        cvNamedWindow("desc",CV_WINDOW_AUTOSIZE);  
        cvShowImage("src",src);  
        cvShowImage("desc",desc);  
        cvWaitKey(0);  
  
        cvReleaseImage(&src);  
        cvReleaseImage(&desc);  
        cvDestroyWindow("src");  
        cvDestroyWindow("desc");  
        return 0;  
    }  
    return 0;  
}  

参考文档

绘图操作

参考文档OpenCV学习笔记:绘图操作

图像通道的分割与合并

#include <cv.h>
#include <highgui.h>

int main()
{
    IplImage *Image1;
    IplImage *RedImage,*GreenImage,*BlueImage;
    IplImage *Channel1,*Channel2,*Channel3;
    CvSize Size1;
    Image1=cvLoadImage("grotto.jpg",1);
    Size1=cvGetSize(Image1);

    Channel1=cvCreateImage(Size1,IPL_DEPTH_8U,1);
    Channel2=cvCreateImage(Size1,IPL_DEPTH_8U,1);
    Channel3=cvCreateImage(Size1,IPL_DEPTH_8U,1);
    cvSplit(Image1,Channel1,Channel2,Channel3,0);  //分割

    BlueImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
    GreenImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
    RedImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
    cvMerge(Channel1,0,0,0,BlueImage); //合并
    cvMerge(0,Channel2,0,0,GreenImage);//合并
    cvMerge(0,0,Channel3,0,RedImage);  //合并

    cvNamedWindow("Red pic",1);
    cvShowImage("Red pic",RedImage);
    cvNamedWindow("Green pic",1);
    cvShowImage("Green pic",GreenImage);
    cvNamedWindow("Blue pic",1);
    cvShowImage("Blue pic",BlueImage);

    cvWaitKey(0);
}

参考文档

矩阵操作

参考文档

Opencv Matrix rotate by 90, 180, 270 degrees

参考文档:

RGB2gray

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "iostream"
 
using namespace cv;
using namespace std;
 
int main( ) {
 
       Mat image;
       image = imread("lena.jpg", CV_LOAD_IMAGE_COLOR); 
 
       if(! image.data ) {
              cout <<  "Could not open or find the image" << std::endl ;
              return -1;
       }
 
       // Create a new matrix to hold the gray image
       Mat gray;
 
       // convert RGB image to gray
       cvtColor(image, gray, CV_BGR2GRAY);
 
       namedWindow( "Display window", CV_WINDOW_AUTOSIZE ); 
       imshow( "Display window", image );                
 
       namedWindow( "Result window", CV_WINDOW_AUTOSIZE );  
       imshow( "Result window", gray );
 
       waitKey(0);                                         
       return 0;
}

参考文档OpenCV example to convert RGB to gray / other color spaces

imread imwrite(opencv2.0)

参考文档: opencv影像读取

OpenCV image loading for OpenGL Texture

参考文档: OpenCV image loading for OpenGL Texture

OpenCV get one single frame from video file

参考文档: How can I get one single frame from a video file?

demo

/*opencv1.0*/

#include "opencv\cv.h"
#include "opencv\cxcore.h"
#include "opencv\highgui.h"
//#include "opencv\cxvideocap.hpp"

int main(int argc, char* argv[]) {

	cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);

	CvCapture* capture = cvCreateFileCapture("IMG_0018.MOV");
	int cap_width = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
	int cap_height = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
	int cap_fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);

	IplImage* frame = nullptr;
	IplImage* rotate = cvCreateImage(cvSize(cap_height, cap_width), IPL_DEPTH_8U, 3);
	CvVideoWriter* writer = cvCreateVideoWriter("new.avi",
												CV_FOURCC('M','J','P','G'),
												cap_fps,
												cvSize(cap_height, cap_width));

	while(1) {
		frame = cvQueryFrame(capture);
		if (!frame) break;
		cvTranspose(frame, rotate);
		cvFlip(rotate, rotate, 1);
		cvShowImage("Example2", rotate);
		cvWriteFrame(writer, rotate);
		if (cvWaitKey(33) == 27) break;
	}

	cvReleaseImage(&rotate);
	cvReleaseCapture(&capture);
	cvReleaseVideoWriter(&writer);
	cvDestroyWindow("Example2");

	return 0;
}
/*opencv2.0*/

#include "opencv2\opencv.hpp"

int main() {
	cv::namedWindow("Example2", CV_WINDOW_AUTOSIZE);
	cv::VideoCapture vc;
	if (!vc.open("IMG_0018.MOV")) {
		cv::destroyWindow("Example2");
		return 1;
	}
	cv::VideoWriter wr;
	if (!wr.open("new.MOV", CV_FOURCC('m','p','4','v'), vc.get(CV_CAP_PROP_FPS), cv::Size(480, 640))) {
		vc.release();
		cv::destroyWindow("Example2");
		return 2;
	}

	cv::Mat frame, rotate, res, roi;
	int count = vc.get(CV_CAP_PROP_FRAME_COUNT);
	while(1) {
		if (vc.get(CV_CAP_PROP_POS_FRAMES) == count)
			vc.set(CV_CAP_PROP_POS_FRAMES, 0);

		if (!vc.read(frame))
			break;

		cv::transpose(frame, rotate);
		cv::flip(rotate, rotate, 1);
#if 1
		// opencv1.0: cvSetImageROI(frame, cvRect(150, 300, 480, 640));
		roi = rotate(cv::Rect(150, 300, 480, 640));
		cv::imshow("Example2", roi);
		wr.write(roi);
		if (cv::waitKey(33) == 27) break;
#else
		cv::resize(rotate, res, cv::Size(480, 640));
		cv::imshow("Example2", res);
		wr.write(res);
		if (cv::waitKey(10) == 27) break;
#endif
	}

	wr.release();
	vc.release();
	cv::destroyWindow("Example2");

	return 0;
}

cvCreateImageHeader

#include <stdio.h>
#include <opencv2/highgui/highgui_c.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/core/core_c.h>

int main (int argc, const char * argv[])
{
	if ( argc != 2 )
	{
		fprintf(stderr, "Expected 2 arguments. Usage: program <filename>\n");
		exit(1);
	}
	
	IplImage* image = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
	
	if ( image == NULL )
	{
		fprintf(stderr, "Couldn't load image.\n");
		exit(1);
	}
	
	IplImage* header1 = cvCreateImageHeader( cvSize(20, 30), image->depth, image->nChannels );
	IplImage* header2 = cvCreateImageHeader( cvSize(20, 30), image->depth, image->nChannels );
	
	// Point to pixel (5,10)
	header1->imageData = image->imageData + (5 * image->nChannels) + (10 * image->widthStep);
	header1->origin = image->origin;
	header1->widthStep = image->widthStep;
	
	// Point to pixel (50,60)
	header2->imageData = image->imageData + (50 * image->nChannels) + (60 * image->widthStep);
	header2->origin = image->origin;
	header2->widthStep = image->widthStep;
	
	cvNot(header1, header1);
	cvNot(header2, header2);
	
	cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
	cvShowImage("Image", image);
	cvWaitKey(0);
	
	cvReleaseImage(&image);
	cvReleaseImage(&header1);
	cvReleaseImage(&header2);

    return 0;
}