I'm trying to get some image processing code working in MS VC++ 2010 express. The code uses opencv so I've downloaded that and installed it. I've created a project and added the opencv files to the project. I've 2 probs that the compiler can't open #include <unistd.h>
and #include <getopt.h>
. Any ideas how to include these headers in my project. Sorry but I'm new to c++ and usually program in android/eclipse. Thanks!
我正在尝试获得一些图像处理代码在vc++ 2010 express工作。代码使用opencv,所以我下载了它并安装了它。我创建了一个项目,并将opencv文件添加到项目中。我有两个probs,编译器不能打开#包括
#include <cv.h>
#include <highgui.h>
#include <math.h>
#include <unistd.h>
#include <getopt.h>
#include <iostream>
void sampleImage(const IplImage* arr, float idx0, float idx1, CvScalar& res)
{
if(idx0<0 || idx1<0 || idx0>(cvGetSize(arr).height-1) || idx1>(cvGetSize(arr).width-1)){
res.val[0]=0;
res.val[1]=0;
res.val[2]=0;
res.val[3]=0;
return;
}
float idx0_fl=floor(idx0);
float idx0_cl=ceil(idx0);
float idx1_fl=floor(idx1);
float idx1_cl=ceil(idx1);
CvScalar s1=cvGet2D(arr,(int)idx0_fl,(int)idx1_fl);
CvScalar s2=cvGet2D(arr,(int)idx0_fl,(int)idx1_cl);
CvScalar s3=cvGet2D(arr,(int)idx0_cl,(int)idx1_cl);
CvScalar s4=cvGet2D(arr,(int)idx0_cl,(int)idx1_fl);
float x = idx0 - idx0_fl;
float y = idx1 - idx1_fl;
res.val[0]= s1.val[0]*(1-x)*(1-y) + s2.val[0]*(1-x)*y + s3.val[0]*x*y + s4.val[0]*x*(1-y);
res.val[1]= s1.val[1]*(1-x)*(1-y) + s2.val[1]*(1-x)*y + s3.val[1]*x*y + s4.val[1]*x*(1-y);
res.val[2]= s1.val[2]*(1-x)*(1-y) + s2.val[2]*(1-x)*y + s3.val[2]*x*y + s4.val[2]*x*(1-y);
res.val[3]= s1.val[3]*(1-x)*(1-y) + s2.val[3]*(1-x)*y + s3.val[3]*x*y + s4.val[3]*x*(1-y);
}
float xscale;
float yscale;
float xshift;
float yshift;
float getRadialX(float x,float y,float cx,float cy,float k){
x = (x*xscale+xshift);
y = (y*yscale+yshift);
float res = x+((x-cx)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
return res;
}
float getRadialY(float x,float y,float cx,float cy,float k){
x = (x*xscale+xshift);
y = (y*yscale+yshift);
float res = y+((y-cy)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
return res;
}
float thresh = 1;
float calc_shift(float x1,float x2,float cx,float k){
float x3 = x1+(x2-x1)*0.5;
float res1 = x1+((x1-cx)*k*((x1-cx)*(x1-cx)));
float res3 = x3+((x3-cx)*k*((x3-cx)*(x3-cx)));
// std::cerr<<"x1: "<<x1<<" - "<<res1<<" x3: "<<x3<<" - "<<res3<<std::endl;
if(res1>-thresh && res1 < thresh)
return x1;
if(res3<0){
return calc_shift(x3,x2,cx,k);
}
else{
return calc_shift(x1,x3,cx,k);
}
}
int main(int argc, char** argv)
{
IplImage* src = cvLoadImage( argv[1], 1 );
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
IplImage* dst2 = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
float K=atof(argv[3]);
float centerX=atoi(argv[4]);
float centerY=atoi(argv[5]);
int width = cvGetSize(src).width;
int height = cvGetSize(src).height;
xshift = calc_shift(0,centerX-1,centerX,K);
float newcenterX = width-centerX;
float xshift_2 = calc_shift(0,newcenterX-1,newcenterX,K);
yshift = calc_shift(0,centerY-1,centerY,K);
float newcenterY = height-centerY;
float yshift_2 = calc_shift(0,newcenterY-1,newcenterY,K);
// scale = (centerX-xshift)/centerX;
xscale = (width-xshift-xshift_2)/width;
yscale = (height-yshift-yshift_2)/height;
std::cerr<<xshift<<" "<<yshift<<" "<<xscale<<" "<<yscale<<std::endl;
std::cerr<<cvGetSize(src).height<<std::endl;
std::cerr<<cvGetSize(src).width<<std::endl;
for(int j=0;j<cvGetSize(dst).height;j++){
for(int i=0;i<cvGetSize(dst).width;i++){
CvScalar s;
float x = getRadialX((float)i,(float)j,centerX,centerY,K);
float y = getRadialY((float)i,(float)j,centerX,centerY,K);
sampleImage(src,y,x,s);
cvSet2D(dst,j,i,s);
}
}
#if 0
cvNamedWindow( "Source1", 1 );
cvShowImage( "Source1", dst);
cvWaitKey(0);
#endif
cvSaveImage(argv[2],dst,0);
#if 0
for(int j=0;j<cvGetSize(src).height;j++){
for(int i=0;i<cvGetSize(src).width;i++){
CvScalar s;
sampleImage(src,j+0.25,i+0.25,s);
cvSet2D(dst,j,i,s);
}
}
cvNamedWindow( "Source1", 1 );
cvShowImage( "Source1", src);
cvWaitKey(0);
#endif
}
2 个解决方案
#1
5
Based on a quick look at this source file, you shouldn't need either of those includes. You definitely don't need getopt
here, as you're not using the getopt
functions it defines. Just remove those includes, and see if things don't just work.
基于快速查看这个源文件,您不应该需要其中任何一个。你肯定不需要getopt,因为你没有使用它定义的getopt函数。只需要删除那些包含的内容,然后看看是否这些东西不只是工作。
#2
7
<unistd.h>
is the Unix standard header and is not found on Windows. http://en.wikipedia.org/wiki/Unistd.h
< unistd。h>是Unix标准报头,在Windows上是找不到的。http://en.wikipedia.org/wiki/Unistd.h
I don't know about <getopt.h>
.
我不知道
It seems that your code is written for a Unix-based machine, not Windows.
您的代码似乎是为基于unix的机器而不是Windows编写的。
#1
5
Based on a quick look at this source file, you shouldn't need either of those includes. You definitely don't need getopt
here, as you're not using the getopt
functions it defines. Just remove those includes, and see if things don't just work.
基于快速查看这个源文件,您不应该需要其中任何一个。你肯定不需要getopt,因为你没有使用它定义的getopt函数。只需要删除那些包含的内容,然后看看是否这些东西不只是工作。
#2
7
<unistd.h>
is the Unix standard header and is not found on Windows. http://en.wikipedia.org/wiki/Unistd.h
< unistd。h>是Unix标准报头,在Windows上是找不到的。http://en.wikipedia.org/wiki/Unistd.h
I don't know about <getopt.h>
.
我不知道
It seems that your code is written for a Unix-based machine, not Windows.
您的代码似乎是为基于unix的机器而不是Windows编写的。