首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

vs2010写个程序,老是显示访问冲突,求高手解决

2013-02-15 
vs2010写个程序,总是显示访问冲突,求高手解决用vs2010与opencv写了个程序,程序中有四个for循环(没有嵌套,

vs2010写个程序,总是显示访问冲突,求高手解决
用vs2010与opencv写了个程序,程序中有四个for循环(没有嵌套,顺序的),这四个循环都要调用一个函数(传递的参数是指针),结果第一个for循环调用时正常运行,第二个for循环调用这个for循环时,总是显示“finalshot.exe 中的 0x01271ca4 处有未经处理的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突”。是不是参数是指针的问题,求高手解决。谢了


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

IplImage* xuanzhuanpj(IplImage* frontImg1,IplImage* leftImg1,IplImage* backImg1,IplImage* rightImg1);
int main(int argc, char* argv[])
{
CvCapture* capture = cvCaptureFromAVI("F:\\1.avi"); 
//cvNamedWindow("qw");
IplImage* frame;
CvVideoWriter *writer1 = 0, *writer2 = 0, *writer3 = 0, *writer4 = 0;
int iscolor = 1;
int fps = 25;
int framew = 176;
int frameh = 105;
writer1 = cvCreateVideoWriter("F:\\41.avi", CV_FOURCC('M','J','P','G'),fps,cvSize

(framew,frameh),iscolor);
writer2 = cvCreateVideoWriter("F:\\42.avi", CV_FOURCC('M','J','P','G'),fps,cvSize

(framew,frameh),iscolor);
writer3 = cvCreateVideoWriter("F:\\43.avi", CV_FOURCC('M','J','P','G'),fps,cvSize

(framew,frameh),iscolor);
writer4 = cvCreateVideoWriter("F:\\44.avi", CV_FOURCC('M','J','P','G'),fps,cvSize

(framew,frameh),iscolor);

cvQueryFrame(capture);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
int temp = numFrames / 4;
printf("\n%d\n", numFrames);


int i;
for (i = 0;i < numFrames; i++)
{
frame = cvQueryFrame(capture);
if (i < temp)
cvWriteFrame(writer1, frame);
else
{
if (i < temp * 2)
cvWriteFrame(writer2, frame);
else
{
if (i < temp * 3)
cvWriteFrame(writer3, frame);
else
if (i < temp * 4) cvWriteFrame(writer4, frame);
}
}
//cvShowImage("qw", frame);
//char key = cvWaitKey(20);
}

CvCapture *capture1 = cvCaptureFromAVI("F:\\41.avi");
CvCapture *capture2 = cvCaptureFromAVI("F:\\42.avi");
CvCapture *capture3 = cvCaptureFromAVI("F:\\43.avi");
CvCapture *capture4 = cvCaptureFromAVI("F:\\44.avi");

IplImage *img1 = 0;
IplImage *img2 = 0;
IplImage *img3 = 0;
IplImage *img4 = 0;
IplImage *img0 = 0;

for (i = 0; i < temp; i++) ////T1         第一个循环,
{

img1 = cvQueryFrame(capture1);
img2 = cvQueryFrame(capture2);
img3 = cvQueryFrame(capture3);
img4 = cvQueryFrame(capture4);
img0 = xuanzhuanpj(img1, img2, img3, img4);    //////调用这个函数正常
cvShowImage("win1",img0);
cvWaitKey(30);
}
for (i = 0; i < temp; i++) ////T2                      ///////第二个循环
{
img1 = cvQueryFrame(capture2);
img2 = cvQueryFrame(capture3);


img3 = cvQueryFrame(capture4);
img4 = cvQueryFrame(capture1);
img0 = xuanzhuanpj(img1, img2, img3, img4);    //////调用出错了
cvShowImage("win1",img0);
cvWaitKey(30);
}
for (i = 0; i < temp; i++)       ////T3
{
img1 = cvQueryFrame(capture3);
img2 = cvQueryFrame(capture4);
img3 = cvQueryFrame(capture1);
img4 = cvQueryFrame(capture2);
img0 = xuanzhuanpj(img1, img2, img3, img4);
cvShowImage("win1",img0);
cvWaitKey(30);
}
for (i = 0; i < temp; i++)            ////T4
{
img1 = cvQueryFrame(capture4);
img2 = cvQueryFrame(capture3);
img3 = cvQueryFrame(capture2);
img4 = cvQueryFrame(capture1);
img0 = xuanzhuanpj(img1, img2, img3, img4);
cvShowImage("win1",img0);
cvWaitKey(30);
}



cvReleaseVideoWriter(&writer1);
cvReleaseVideoWriter(&writer2);
cvReleaseVideoWriter(&writer3);
cvReleaseVideoWriter(&writer4);
cvReleaseCapture(&capture);
//cvDestroyWindow("qw");
cvDestroyWindow("qw");
system ("pause");
return 0;
}

// clockwise 为true则顺时针旋转,否则为逆时针旋转
IplImage* rotateImage(IplImage* src, int angle, bool clockwise)
{
int Ttemp = angle;

angle = abs(angle) % 180;
if (angle > 90)
{
angle = 90 - (angle % 90);
}

IplImage* dst = NULL;
int width =
(double)(src->height * sin(angle * CV_PI / 180.0)) +
(double)(src->width * cos(angle * CV_PI / 180.0 )) + 1;
int height =
(double)(src->height * cos(angle * CV_PI / 180.0)) +
(double)(src->width * sin(angle * CV_PI / 180.0 )) + 1;
int tempLength = sqrt((double)src->width * src->width + src->height * src->height) + 10;
int tempX = (tempLength + 1) / 2 - src->width / 2;
int tempY = (tempLength + 1) / 2 - src->height / 2;
int flag = -1;

dst = cvCreateImage(cvSize(width, height), src->depth, src->nChannels);
cvZero(dst);
IplImage* temp = cvCreateImage(cvSize(tempLength, tempLength), src->depth, src->nChannels);
cvZero(temp);

cvSetImageROI(temp, cvRect(tempX, tempY, src->width, src->height));
cvCopy(src, temp, NULL);
cvResetImageROI(temp);

if (clockwise)
flag = 1;
if (Ttemp == 180) angle = Ttemp;
float m[6];
int w = temp->width;
int h = temp->height;
m[0] = (float) cos(flag * angle * CV_PI / 180.);
m[1] = (float) sin(flag * angle * CV_PI / 180.);
m[3] = -m[1];
m[4] = m[0];
// 将旋转中心移至图像中间
m[2] = w * 0.5f;
m[5] = h * 0.5f;
//


CvMat M = cvMat(2, 3, CV_32F, m);
cvGetQuadrangleSubPix(temp, dst, &M);
cvReleaseImage(&temp);
return dst;
}

IplImage* xuanzhuanpj(IplImage* frontImg1,IplImage* leftImg1,IplImage* backImg1,IplImage* rightImg1)
{
CvSize dstSize;
    dstSize.width = leftImg1->width + leftImg1->height * 2.0 + 4;
    dstSize.height = frontImg1->width + frontImg1->height * 2.0 + 4;
//dstSize.width = 176 + 105 * 2.0 + 4;
    //dstSize.height = 176 + 105 * 2.0 + 4;
IplImage* dstImg = cvCreateImage(dstSize, frontImg1->depth, frontImg1->nChannels);
cvZero(dstImg);

IplImage* frontImg = cvCreateImage(cvGetSize(frontImg1), frontImg1->depth, 1);         
    IplImage* backImg = cvCreateImage(cvGetSize(backImg1), backImg1->depth, 1);
    IplImage* leftImg = cvCreateImage(cvGetSize(leftImg1), leftImg1->depth, 1);
IplImage* rightImg = cvCreateImage(cvGetSize(rightImg1), rightImg1->depth , 1);

frontImg = frontImg1;
backImg =  rotateImage(backImg1, 180,0);
rightImg = rotateImage(rightImg1, 90, 0);
leftImg = rotateImage(leftImg1, 90, 1);

cvSetImageROI(dstImg, cvRect(0 ,frontImg->height + 1, leftImg->width, leftImg->height));
cvRepeat(leftImg, dstImg);
cvResetImageROI(dstImg);

cvSetImageROI(dstImg, cvRect(frontImg->height + 1, frontImg->height + frontImg->width + 2, 

frontImg->width, frontImg->height));
cvCopy(frontImg, dstImg);
cvResetImageROI(dstImg);

cvSetImageROI(dstImg, cvRect(frontImg->height + 1, 0, backImg->width, backImg->height));
cvCopy(backImg, dstImg);
cvResetImageROI(dstImg);

cvSetImageROI(dstImg, cvRect(frontImg->height + frontImg->width + 2, frontImg->height + 1, 

rightImg->width, rightImg->height));
cvCopy(rightImg, dstImg);
cvResetImageROI(dstImg);

//cvReleaseImage(&frontImg);
    cvReleaseImage(&backImg);
    cvReleaseImage(&leftImg);
cvReleaseImage(&rightImg);
//cvReleaseImage(&frontImg1);
//    cvReleaseImage(&backImg1);
//    cvReleaseImage(&leftImg1);
//cvReleaseImage(&rightImg1);

return dstImg;
}




多谢了。 c++? vs2010 opencv 指针 参数传递
[解决办法]
引用:
引用:肯定是指针的问题,你断点一步一步的调试,看是哪一句出错了。
是调用的函数第二句,反正就是不能用参数变量,如果我把使用参数变量的那两句换成下面我//的2句(就是直接赋数值),那么这两句就不出错了,但是下面需要用到参数变量的语句依然出错,我是编程新手,不知道怎么解决,请你指点下,多谢!
C/C++ code?1234567891011……


我把你的程序跑了一遍。我知道你哪里错了。

    writer1 = cvCreateVideoWriter("F:\\41.avi", CV_FOURCC('M','J','P','G'),fps,cvSize
             (framew,frameh),iscolor);


    writer2 = cvCreateVideoWriter("F:\\42.avi", CV_FOURCC('M','J','P','G'),fps,cvSize
              (framew,frameh),iscolor);
    writer3 = cvCreateVideoWriter("F:\\43.avi", CV_FOURCC('M','J','P','G'),fps,cvSize
               (framew,frameh),iscolor);
    writer4 = cvCreateVideoWriter("F:\\44.avi", CV_FOURCC('M','J','P','G'),fps,cvSize
              (framew,frameh),iscolor);

是你的这4个函数没有执行成功。执行完后,41 42 43 44这4个视频文件是空的。

img1 = cvQueryFrame(capture2);
img2 = cvQueryFrame(capture3);
img3 = cvQueryFrame(capture4);
img4 = cvQueryFrame(capture1);
img0 = xuanzhuanpj(img1, img2, img3, img4);

这样img1到img4都是空指针,这样传空指针到xuanzhuanpj函数里面,当然要出错了。

但是你把这4个函数注释掉,然后你自己拷贝4个已经有内容的avi文件到F盘下,然后执行函数,就成功了。

所以你自己好好检查一下cvCreateVideoWriter函数,参数是不是给对了,或者别的什么原因。我好长一段时间没写OpenCV了,忘了具体的了。
[解决办法]
如果运行exe的机器不是开发exe的机器,请将开发机上bin\opencv_*.dll拷贝到运行机上和exe相同的目录下。

热点排行