opencv 图像处理

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
int main(int argc, char* argv[]) {
IplImage *plmg=NULL;//定义一个图像指针
    plmg = cvLoadImage("E://1.jpg",1);//加载一个图像赋给图像指针,0为灰度,>0为彩色


if (!plmg) {
printf("can not load image\n");
}
cvFlip(plmg, NULL, 0);//图片翻转 NULL表示原图像吧,0表示翻转方向->可大于0 可小余0
IplImage *pdst = cvCreateImage(CvSize(plmg->height, plmg->width), plmg->depth, plmg->nChannels);


pdst = cvCreateImage(CvSize(200, 400), plmg->depth, plmg->nChannels);
//cvTranspose(plmg,pdst);//图像转置


cvResize(plmg,pdst);//图像的缩放
/*IplImage *img = cvCreateImage(cvSize(300,400),8,3);
CvScalar s;
int i=100, j=150;
s = cvGet2D(img, i, j);
printf("B=%d,G=%d,R=%d",s.val[0],s.val[1],s.val[2]);
s.val[0] = 0;
s.val[1] = 0;
s.val[2] = 254;
cvSet2D(img,i,j,s);//修改彩色图像的像素值(间接修改)
printf("B=%f,G=%f,R=%f", s.val[0], s.val[1], s.val[2]);*/
IplImage *img = cvCreateImage(cvSize(300, 400), 8, 1);
int i = 50, j = 60;
((uchar *)(img->imageData + img->widthStep*i))[j] = 111;//直接修改


IplImage *imgq = cvCreateImage(cvSize(400, 300), 8, 3);
cvZero(imgq);
CV_IMAGE_ELEM(imgq, uchar, i , j * 3 + 0) = 111;//运用宏修改彩色图像的像素值
CV_IMAGE_ELEM(imgq, uchar, i ,j * 3 + 1) = 112;
CV_IMAGE_ELEM(imgq, uchar, i , j * 3 + 2) = 113;


cvNamedWindow("TEST", CV_WINDOW_AUTOSIZE);//创建一个窗口 取名为TEST
cvShowImage("TEST", img);//显示TEST窗口并显示出载入的图像
cvWaitKey(0);//等待一个键盘输入,参数是等待的时间,0表示一直等待;10表示等待10毫秒
cvDestroyWindow("TEST");//销毁窗口
cvReleaseImage(&img);//释放pimg指向的图像内存
return 1;
cvResizeWindow("TEST", 300, 150);//设置窗口大小
cvMoveWindow("TEST", 200, 200);//移动窗口



CvPoint pt = cvPoint(100,200);
pt.x = 300;
pt.y = 200;


CvScalar sc = cvScalar(1.0,0.7,9.0,4.5);
sc.val[0] = 2.0;//val[4]是大小为4的结构体 默认四个值为0


CvSize sz = cvSize(300,500);//设置大小


CvRect rct = cvRect(20, 30, 100, 200);//(20,30)为左上角坐标,100为宽度,200为高度
plmg = cvCreateImage(sz, 8, 1);//cvCreateImage(cvsSize(220,180),8,1);
cvZero(plmg);
cvNamedWindow("TEST", 0);//创建一个窗口 取名为TEST
cvResizeWindow("TEST", 300, 150);//设置窗口大小
cvMoveWindow("TEST", 200, 200);//移动窗口


IplImage *img2;
img2 = cvCloneImage(plmg);//复制图片给img2 需要释放两个空间
img2 = plmg;//指向同一个对象


IplImage *img1 = cvCreateImage(cvSize(640,800),8,1);
IplImage *img3 = cvCreateImage(cvSize(640,800),8,1);
cvCopy(img1,img3,NULL);//将img1复制给img3
cvNamedWindow("T", 1);
cvShowImage("T", img3);


cvSaveImage("E:\\tmp.jpg", img1);//将img1保存在E盘下命名为tmp,并且类型为.jpg


cvShowImage("TEST", plmg);//显示TEST窗口并显示出载入的图像
cvWaitKey(0);//等待一个键盘输入,参数是等待的时间,0表示一直等待;10表示等待10毫秒
cvDestroyWindow("TEST");//销毁窗口
cvReleaseImage(&plmg);//释放pimg指向的图像内存
return 0;

}

 

 

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>


void on_mouse(int event, int x, int y, int flags, void* param) {//鼠标事件处理
IplImage *img = (IplImage *)param;
switch(event)
{
case CV_EVENT_MOUSEMOVE: 
if (flags & CV_EVENT_FLAG_CTRLKEY) {
//printf("Left button down with CTRL pressed\n");
CV_IMAGE_ELEM(img, uchar, y , x * 3 + 0) = 0;
CV_IMAGE_ELEM(img, uchar, y , x * 3 + 1) = 0;
CV_IMAGE_ELEM(img, uchar, y , x * 3 + 2) = 255;

}
break;
case CV_EVENT_RBUTTONDOWN:
//printf("Left button up\n");
CV_IMAGE_ELEM(img, uchar, y, x * 3 + 0) = 255;
CV_IMAGE_ELEM(img, uchar, y, x * 3 + 1) = 0;
CV_IMAGE_ELEM(img, uchar, y, x * 3 + 2) = 0;
break;
}
}




void DrawtoBK(IplImage *pbk, IplImage *pobj, int x,int y) {//背景绘制
if (pbk != NULL&&pobj != NULL)
{
for (int i = 0; i < pobj->height; i++)
{
for (int j = 0; j < pobj->width; j++)
{
CV_IMAGE_ELEM(pbk, uchar, y + i, (j + x) * 3 + 0) = CV_IMAGE_ELEM(pobj, uchar, i, j * 3 + 0);
CV_IMAGE_ELEM(pbk, uchar, y + i, (j + x) * 3 + 1) = CV_IMAGE_ELEM(pobj, uchar, i, j * 3 + 1);
CV_IMAGE_ELEM(pbk, uchar, y + i, (j + x) * 3 + 2) = CV_IMAGE_ELEM(pobj, uchar, i, j * 3 + 2);
}
}
}
}


void MoveTower(IplImage *pbk , IplImage *pobj , int x , int y) {//34*32移动物体
IplImage *p;
p = cvLoadImage("11.jpg", 1);
for (int i = 1; i <= 4; i++)
{
cvCopy(p, pbk);
x += 34;
char key = cvWaitKey(500);
if (key == 27)
{
break;
}
DrawtoBK(pbk, pobj, x, y);
cvNamedWindow("Tower", 1);
cvShowImage("Tower", pbk);
}
for (int i = 1; i <= 4; i++)
{
y += 32;
cvCopy(p, pbk);
DrawtoBK(pbk, pobj, x, y);
cvWaitKey(500);
cvNamedWindow("Tower", 1);
cvShowImage("Tower", pbk);

}

}
int main(int argc, char* argv[])
{
IplImage *pbk = NULL;
IplImage *pobj = NULL;
pbk = cvLoadImage("11.jpg",1);
pobj = cvLoadImage("1.jpg",1);
//cvFlip(pbk, NULL, -1);
cvNamedWindow("Tower", 1);
cvMoveWindow("Tower", 100, 100);
//cvSetMouseCallback("Tower", on_mouse, pbk);
while (1)
{
cvWaitKey(1);
cvSetMouseCallback("Tower", on_mouse, pbk);
cvShowImage("Tower", pbk);


}
cvShowImage("Tower", pbk);
int x = 10, y = 10;
DrawtoBK(pbk, pobj, x, y);
    MoveTower(pbk, pobj, x, y);

cvWaitKey(0);
cvDestroyWindow("Tower");
cvReleaseImage(&pbk);
cvReleaseImage(&pobj);
return 0;


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值