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

秦格伍兹 2013-01-30 11:04:00
用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;
}




多谢了。
...全文
641 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
秦格伍兹 2013-01-30
  • 打赏
  • 举报
回复
引用 3 楼 ppsharp 的回复:
肯定是指针的问题,你断点一步一步的调试,看是哪一句出错了。
是调用的函数第二句,反正就是不能用参数变量,如果我把使用参数变量的那两句换成下面我//的2句(就是直接赋数值),那么这两句就不出错了,但是下面需要用到参数变量的语句依然出错,我是编程新手,不知道怎么解决,请你指点下,多谢!

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);
……
 
ppsharp 2013-01-30
  • 打赏
  • 举报
回复
肯定是指针的问题,你断点一步一步的调试,看是哪一句出错了。
秦格伍兹 2013-01-30
  • 打赏
  • 举报
回复
引用 1 楼 ppsharp 的回复:
你这是OpenCV的程序。
嗯,我是新手菜鸟~
ppsharp 2013-01-30
  • 打赏
  • 举报
回复
你这是OpenCV的程序。
秦格伍兹 2013-01-30
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
如果运行exe的机器不是开发exe的机器,请将开发机上bin\opencv_*.dll拷贝到运行机上和exe相同的目录下。
多谢~
秦格伍兹 2013-01-30
  • 打赏
  • 举报
回复
引用 8 楼 ppsharp 的回复:
引用 4 楼 D_Fur 的回复:引用 3 楼 ppsharp 的回复:肯定是指针的问题,你断点一步一步的调试,看是哪一句出错了。 是调用的函数第二句,反正就是不能用参数变量,如果我把使用参数变量的那两句换成下面我//的2句(就是直接赋数值),那么这两句就不出错了,但是下面需要用到参数变量的语句依然出错,我是编程新手,不知道怎么解决,请你指点下,多谢! C/C++ c……
多谢,找到错误了,第二个for循环前,其实capture1,2,3,4因为第一个for循环已经指向空了。
赵4老师 2013-01-30
  • 打赏
  • 举报
回复
如果运行exe的机器不是开发exe的机器,请将开发机上bin\opencv_*.dll拷贝到运行机上和exe相同的目录下。
ppsharp 2013-01-30
  • 打赏
  • 举报
回复
引用 4 楼 D_Fur 的回复:
引用 3 楼 ppsharp 的回复:肯定是指针的问题,你断点一步一步的调试,看是哪一句出错了。 是调用的函数第二句,反正就是不能用参数变量,如果我把使用参数变量的那两句换成下面我//的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了,忘了具体的了。
赵4老师 2013-01-30
  • 打赏
  • 举报
回复
前半段是提示你看Call Stack并利用其内容定位到导致出错的函数调用处。 后半段是提示你当发现某个变量值被莫名其妙修改时,在该变量上设置值改变断点,然后调试运行(按F5),调试器或帮你自动暂停在修改该变量值的代码处。
秦格伍兹 2013-01-30
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 To set a breakpoint when a variable changes value From the Edit menu, click Breakpoint……
感谢这位超级大牛的回复,可是我新手,不知道我怎么利用您说的解决我的问题。
赵4老师 2013-01-30
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 To set a breakpoint when a variable changes value From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint.

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧