书上第四章第一个练习题:
创建一个新的图像,其高度与原始图像相同,宽度为原来视频帧的3倍,将3副图像分别复制到新的图像中:
我做成一个类:
#pragma once
#include"cv.h"
#include "highgui.hpp"
using namespace cv;
#include"iostream"
using namespace std;
class opencv_4_1
{
private:
CvCapture * capture;
IplImage * img;
int fps;
IplImage *gray;
IplImage *canny;
IplImage *all;
CvFont word;
public:
opencv_4_1();
~opencv_4_1();
void initCapture();
void ans_1();
void ans_2();
};
头文件:
void opencv_4_1::ans_2() {
cvNamedWindow("all",0);
initCapture();
cvInitFont(&word, CV_FONT_HERSHEY_SCRIPT_COMPLEX, 1, 1, 1.0, 1);
while (1) {
img = cvQueryFrame(capture);
if (!img)break;
gray = cvCreateImage(CvSize(cvGetSize(img)), img->depth, 1);
cvConvertImage(img, gray, CV_BGR2GRAY);
canny = cvCloneImage(gray);
cvCanny(gray, canny, 10, 30, 3);
cvPutText(gray, "gray", CvPoint(250, 250), &word, CvScalar(255));
cvPutText(img, "original", CvPoint(250,250), &word, CvScalar(255));
cvPutText(canny, "canny", CvPoint(250, 250),&word, CvScalar(255));
all = cvCreateImage(CvSize(img->width * 3, img->height), img->depth, img->nChannels);
//指针方法
IplImage * part_1 = cvCreateImageHeader(CvSize(cvGetSize(img)), img->depth, img->nChannels);
IplImage * part_2 = cvCreateImageHeader(CvSize(cvGetSize(img)), img->depth, img->nChannels);
IplImage * part_3 = cvCreateImageHeader(CvSize(cvGetSize(img)), img->depth, img->nChannels);
part_1->origin = part_2->origin = part_3->origin = all->origin;
part_1->widthStep = part_2->widthStep = part_3->widthStep = all->widthStep;
part_1->imageData = (char *)cvPtr2D(all, 0, 0);
part_2->imageData = (char *)cvPtr2D(all, 0, img->width);
part_3->imageData = (char *)cvPtr2D(all, 0, img->width*2);
cvCopy(img, part_1);
cvConvertImage(gray, part_2, CV_GRAY2BGR);
cvConvertImage(canny, part_3, CV_GRAY2BGR);
/*
//imageROI
cvSetImageROI(all, CvRect(0, 0, img->width, img->height));
all->nChannels = img->nChannels;
cvCopy(img, all);
cvResetImageROI(all);
cvSetImageROI(all, CvRect(img->width, 0, gray->width, gray->height));
all->nChannels = gray->nChannels;
cvCopy(gray, all);
cvResetImageROI(all);
cvSetImageROI(all, CvRect(img->width*2, 0, canny->width, canny->height));
all->nChannels = canny->nChannels;
cvCopy(canny, all);
cvResetImageROI(all);
*/
cvShowImage("all",all);
if (cvWaitKey(fps) == 27)break;
}
cvDestroyWindow("all");
}
缺点:
融合之后采用指针方法,全部变成三通道函数,效果图:
采用ROI方法:
结果就自动变成单通道图像了,第一张就自然没有彩色的效果了,