关于一个opencv的小程序 图像变形了。解决办法
关于一个opencv的小程序 图像变形了。。
#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace std;
int main(int argc,char *argv[])
{
IplImage *img1=0;//源图像
int height;
int width;
int step;
int channels;
uchar *data;
img1=cvLoadImage("hello.jpg",0);
if (!img1)
{
printf("could not load image file: %s\n","image.jpg");
exit(0);
}
height=img1->height;
width=img1->width;
step=img1->widthStep;
channels=img1->nChannels;
data=(uchar*)img1->imageData;
//创建窗口
cvNamedWindow("源图像",CV_WINDOW_AUTOSIZE);
cvMoveWindow("处理图像",100,100);//移动窗口,以屏幕左上角的起点的偏移量
IplImage *image2=cvCreateImage(cvSize(img1->width,img1->height),img1->depth,1);
uchar *p=(uchar *)image2->imageData;//获得新图像的内存数据块儿
int pixel[3];
BYTE* pTemp = NULL;
for(int j=0;j<height-1;j++)
{
for (int i=0;i<width-1;i++)
{
pTemp = data+width*j+i; //指向源图像的第j行,第i个像素的指针
pixel[0]=(unsigned char)*pTemp ;
pixel[1]=(unsigned char)*(pTemp + 1);
pixel[2]=(unsigned char)*(pTemp+width);
pixel[3]=(unsigned char)*(pTemp+width+1);
//pixel[0]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j-1];
//pixel[1]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j];
//pixel[2]=(int)((uchar *)img1->imageData)[i*img1->widthStep+j-1];
//pixel[3]=(int)((uchar *)img1->imageData)[(i+1)*img1->widthStep+j+1];
//计算目标图像中的当前点
p[j*img1->widthStep+i]=sqrt(double((pixel[0]- pixel[3])*(pixel[0]- pixel[3])+(pixel[1]-pixel[2])*(pixel[1]- pixel[2])));
}
}
cvShowImage("源图像",img1);
cvShowImage("处理图像",image2);
cvWaitKey(0);
cvReleaseImage(&img1);
cvReleaseImage(&image2);
}
是关于robert变换的,但是结果变形了都????
------最佳解决方案--------------------
pixel[1]=(unsigned char)*(pTemp + 1);
pixel[2]=(unsigned char)*(pTemp+width);
pixel[3]=(unsigned char)*(pTemp+width+1);
//pixel[0]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j-1];
//pixel[1]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j];
//pixel[2]=(int)((uchar *)img1->imageData)[i*img1->widthStep+j-1];
//pixel[3]=(int)((uchar *)img1->imageData)[(i+1)*img1->widthStep+j+1];有问题
#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace std;
int main(int argc,char *argv[])
{
IplImage *img1=0;//源图像
int height;
int width;
int step;
int channels;
uchar *data;
img1=cvLoadImage("hello.jpg",0);
if (!img1)
{
printf("could not load image file: %s\n","image.jpg");
exit(0);
}
height=img1->height;
width=img1->width;
step=img1->widthStep;
channels=img1->nChannels;
data=(uchar*)img1->imageData;
//创建窗口
cvNamedWindow("源图像",CV_WINDOW_AUTOSIZE);
cvMoveWindow("处理图像",100,100);//移动窗口,以屏幕左上角的起点的偏移量
IplImage *image2=cvCreateImage(cvSize(img1->width,img1->height),img1->depth,1);
uchar *p=(uchar *)image2->imageData;//获得新图像的内存数据块儿
int pixel[3];
BYTE* pTemp = NULL;
for(int j=0;j<height-1;j++)
{
for (int i=0;i<width-1;i++)
{
pTemp = data+width*j+i; //指向源图像的第j行,第i个像素的指针
pixel[0]=(unsigned char)*pTemp ;
pixel[1]=(unsigned char)*(pTemp + 1);
pixel[2]=(unsigned char)*(pTemp+width);
pixel[3]=(unsigned char)*(pTemp+width+1);
//pixel[0]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j-1];
//pixel[1]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j];
//pixel[2]=(int)((uchar *)img1->imageData)[i*img1->widthStep+j-1];
//pixel[3]=(int)((uchar *)img1->imageData)[(i+1)*img1->widthStep+j+1];
//计算目标图像中的当前点
p[j*img1->widthStep+i]=sqrt(double((pixel[0]- pixel[3])*(pixel[0]- pixel[3])+(pixel[1]-pixel[2])*(pixel[1]- pixel[2])));
}
}
cvShowImage("源图像",img1);
cvShowImage("处理图像",image2);
cvWaitKey(0);
cvReleaseImage(&img1);
cvReleaseImage(&image2);
}
是关于robert变换的,但是结果变形了都????
------最佳解决方案--------------------
pixel[1]=(unsigned char)*(pTemp + 1);
pixel[2]=(unsigned char)*(pTemp+width);
pixel[3]=(unsigned char)*(pTemp+width+1);
//pixel[0]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j-1];
//pixel[1]=(int)((uchar *)img1->imageData)[(i-1)*img1->widthStep+j];
//pixel[2]=(int)((uchar *)img1->imageData)[i*img1->widthStep+j-1];
//pixel[3]=(int)((uchar *)img1->imageData)[(i+1)*img1->widthStep+j+1];有问题