C# 调用opencv的标定方法出现内存访问错误

ailby0709 2014-05-15 04:24:41
代码是在百度上搜到的,原文是用C++写的,我在下面贴出地址,我给翻译成了C#,大神么可以直接看C#代码。
我也不知道问题发在这里对不对,不对的话麻烦版主帮转移一下,谢谢。

private unsafe void button1_Click(object sender, EventArgs e)
{
int n_board = 12;//图像数目
int sn_board = 0;//成功找到角点的图像数目
int board_w = 5;
int board_h = 4;
int board_n = board_h * board_w;//每幅图像的角点数
CvSize patter_size = cxtypes.CvSize(board_w, board_h);//每幅图像的角点数
CvPoint2D32f[] corners = new CvPoint2D32f[board_n];//一幅图像的角点数组
CvMat object_points = cxcore.CvCreateMat(board_n * n_board, 3, cxtypes.CV_32FC1);
CvMat image_points = cxcore.CvCreateMat(board_n * n_board, 2, cxtypes.CV_32FC1);
CvMat point_counts = cxcore.CvCreateMat(n_board, 1, cxtypes.CV_32SC1);
float* imagePointPtr = (float*)image_points.data;
float* objectPointPtr = (float*)object_points.data;
int* pointCountPtr = (int*)point_counts.data;
CvSize image_size = cxtypes.CvSize(1600, 1200);
GCHandle handleSrc1 = GCHandle.Alloc(corners, GCHandleType.Pinned);
IntPtr connerPtr = handleSrc1.AddrOfPinnedObject();
for (int i = 1; i <= n_board; i++)
{
string fileName = "image\\biaoding\\biaoding_" + (i).ToString() + ".bmp";
/*读入图像*/
IplImage SourceImg = highgui.CvLoadImage(fileName, highgui.CV_LOAD_IMAGE_COLOR);
image_size = cxcore.CvGetSize(ref SourceImg);//图像的大小
IplImage SourceImgGray = cxcore.CvCreateImage(image_size, (int)cxtypes.IPL_DEPTH_8U, 1);
cv.CvCvtColor(ref SourceImg, ref SourceImgGray, cvtypes.CV_BGR2GRAY);
int corner_count = 0;
cv.CvFindChessboardCorners(ref SourceImgGray, patter_size, connerPtr, ref corner_count, cv.CV_CALIB_CB_ADAPTIVE_THRESH | cv.CV_CALIB_CB_FILTER_QUADS);
cv.CvFindCornerSubPix(ref SourceImgGray, connerPtr, corner_count, cxtypes.CvSize(11, 11), cxtypes.CvSize(-1, -1), cxtypes.cvTermCriteria(cxtypes.CV_TERMCRIT_EPS + cxtypes.CV_TERMCRIT_ITER, 30, 0.1));//CvSize win 和matlab标定工具箱类似
cv.CvDrawChessboardCorners(ref SourceImg, patter_size, connerPtr, corner_count, 1);
if (cv.CvFindChessboardCorners(ref SourceImgGray, patter_size, connerPtr, ref corner_count, cv.CV_CALIB_CB_ADAPTIVE_THRESH | cv.CV_CALIB_CB_FILTER_QUADS) == 0)
{
cxcore.CvReleaseImage(ref SourceImgGray);
cxcore.CvReleaseImage(ref SourceImg);
Console.WriteLine("无法找出第" + i.ToString() + "幅图像的角点!");
return;
}
else
{
cv.CvFindCornerSubPix(ref SourceImgGray, connerPtr, corner_count, cxtypes.CvSize(11, 11), cxtypes.CvSize(-1, -1), cxtypes.cvTermCriteria(cxtypes.CV_TERMCRIT_EPS + cxtypes.CV_TERMCRIT_ITER, 30, 0.1));//CvSize win 和matlab标定工具箱类似
cv.CvDrawChessboardCorners(ref SourceImg, patter_size, connerPtr, corner_count, 1);
}
for (int j = sn_board * board_n, k = 0; k < board_n; ++j, ++k)
{
*(imagePointPtr + image_points.step / 4 * j + 0) = corners[k].x;
*(imagePointPtr + image_points.step / 4 * j + 1) = corners[k].y;
*(objectPointPtr + object_points.step / 4 * j + 0) = ((float)k) / board_w;
*(objectPointPtr + object_points.step / 4 * j + 1) = ((float)k) % board_w;
*(objectPointPtr + object_points.step / 4 * j + 2) = 0.0f;
}
*(pointCountPtr + point_counts.step / 4 * sn_board + 0) = board_n;
sn_board++;
cxcore.CvReleaseImage(ref SourceImgGray);
cxcore.CvReleaseImage(ref SourceImg);
}
handleSrc1.Free();
Console.WriteLine("一共成功获得" + sn_board.ToString() + "幅图的角点!无法获得" + (n_board - sn_board).ToString() + "幅图像的角点");
//重新赋值
CvMat object_points0 = cxcore.CvCreateMat(board_n * sn_board, 3, cxtypes.CV_32FC1);
CvMat image_points0 = cxcore.CvCreateMat(board_n * sn_board, 2, cxtypes.CV_32FC1);
CvMat point_counts0 = cxcore.CvCreateMat(sn_board, 1, cxtypes.CV_32SC1);
float* imagePoint0Ptr = (float*)image_points0.data;
float* objectPoint0Ptr = (float*)object_points0.data;
for (int i = 0; i < sn_board * board_n; i++)
{
*(imagePoint0Ptr + image_points0.step / 4 * i + 0) = *(imagePointPtr + image_points.step / 4 * i + 0);
*(imagePoint0Ptr + image_points0.step / 4 * i + 1) = *(imagePointPtr + image_points.step / 4 * i + 1);
*(objectPoint0Ptr + object_points0.step / 4 * i + 0) = *(objectPointPtr + object_points.step / 4 * i + 0);
*(objectPoint0Ptr + object_points0.step / 4 * i + 1) = *(objectPointPtr + object_points.step / 4 * i + 1);
*(objectPoint0Ptr + object_points0.step / 4 * i + 2) = 0.0f;
}
int* pointCount0Ptr = (int*)point_counts0.data;
for (int i = 0; i < sn_board; i++)
{
*(pointCount0Ptr + point_counts0.step / 4 * i + 0) = *(pointCountPtr + point_counts.step / 4 * i + 0);
}
cxcore.CvReleaseMat(ref object_points);
cxcore.CvReleaseMat(ref point_counts);
cxcore.CvReleaseMat(ref image_points);
CvMat camera_matrix = cxcore.CvCreateMat(3, 3, cxtypes.CV_32FC1);
CvMat distortion_coeffs = cxcore.CvCreateMat(1, 4, cxtypes.CV_32FC1);
CvMat rotation_vectors = cxcore.CvCreateMat(sn_board, 3, cxtypes.CV_32FC1);
CvMat translation_vectors = cxcore.CvCreateMat(sn_board, 3, cxtypes.CV_32FC1);
/*摄像机标定并求得内部参数*/
cv.CvCalibrateCamera2(ref object_points0, ref image_points0, ref point_counts0, image_size, ref camera_matrix, ref distortion_coeffs, ref rotation_vectors, ref translation_vectors, 0);
cxcore.CvReleaseMat(ref object_points);
cxcore.CvReleaseMat(ref point_counts);
cxcore.CvReleaseMat(ref image_points);
cxcore.CvReleaseMat(ref object_points0);
cxcore.CvReleaseMat(ref point_counts0);
cxcore.CvReleaseMat(ref image_points0);
cxcore.CvReleaseMat(ref camera_matrix);
cxcore.CvReleaseMat(ref distortion_coeffs);
cxcore.CvReleaseMat(ref rotation_vectors);
cxcore.CvReleaseMat(ref translation_vectors);
}

执行这步的时候cv.CvCalibrateCamera2(ref object_points0, ref image_points0, ref point_counts0, image_size, ref camera_matrix, ref distortion_coeffs, ref rotation_vectors, ref translation_vectors, 0);出错,accessviolationexception,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。请各路大神帮忙看下。
C++代码连接:http://hi.baidu.com/lin65505578/item/fcb30f34031003f9e7bb7aa8,若有侵权请联系,马上撤掉。
...全文
226 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ailby0709 2014-05-16
  • 打赏
  • 举报
回复
引用 3 楼 ann5217 的回复:
有可能是软件冲突,如果安装了matlib,可以卸载试试。
卸载完之后就好用了。 纠结了我两天的问题终于解决了。
ann5217 2014-05-16
  • 打赏
  • 举报
回复
有可能是软件冲突,如果安装了matlib,可以卸载试试。
ailby0709 2014-05-15
  • 打赏
  • 举报
回复
各位大神快显灵吧
ailby0709 2014-05-15
  • 打赏
  • 举报
回复
可能就是一个内存的问题, 我就是找不到问题出现在哪了,顶一下吧

110,477

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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