픽셀기반 영상처리 과정에서 포인터 에러가 발생하는것 같습니다.

조회수 1283회

안녕하세요.

저는 영상처리 전공의 석사과정의 대학원생입니다.

전공 자체가 전자공학분야라 코딩은 아예 독학으로 학습해서 기본기가 많이 부족합니다.

카메라 두대를 이용한 실시간 영상처리 시스템인데 필요에 의해 색상 반전을 하기 위해 기본적인 전처리가 끝난 변수 ROI_L, ROI_R을 InvertColor 함수에 대입하여 색상 반전을 하는 과정입니다.

색상 반전은 각각의 IplImage 타입의 변수에 대한 픽셀 데이터를 추출하여 반전시키는 방법으로 시도하였습니다.

디버깅을 통해 InvertColor 함수에서 CrtlsValidHeapPointer에서 에러가 발생한 것을 알 수 있었습니다.

구글링을 통해 검색해본 결과 포인터 지정하는 과정에서 잘못된 포인터 지정으로 에러가 발생하였다는것을 알 수 있었는데 전체적으로 코드를 여러번 확인해봐도 잘못된 부분이 어딘지 잘 모르겠습니다.

어디서 잘못된 포인터를 사용한건지 고수분들의 도움이 필요합니다.

int main()
{
.
.
.
IplImage *Img_L = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
IplImage *Img_R = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);

IplImage *cImg_L = cvCreateImage(cvSize(580, 740), IPL_DEPTH_8U, 1);
IplImage *cImg_R = cvCreateImage(cvSize(580, 740), IPL_DEPTH_8U, 1);

IplImage* ROI_L = cvCreateImage(cvSize((point_L2.x - point_L1.x), (point_L2.y - point_L1.y)), IPL_DEPTH_8U, 1);
IplImage* ROI_R = cvCreateImage(cvSize((point_R2.x - point_R1.x), (point_R2.y - point_R1.y)), IPL_DEPTH_8U, 1);

IplImage* Inv_L = cvCreateImage(cvGetSize(ROI_L), IPL_DEPTH_8U, 1);
IplImage* Inv_R = cvCreateImage(cvGetSize(ROI_R), IPL_DEPTH_8U, 1);

IplImage* dst_L = cvCreateImage(cvGetSize(ROI_L), IPL_DEPTH_8U, 1);
IplImage* dst_R = cvCreateImage(cvGetSize(ROI_R), IPL_DEPTH_8U, 1);

CvCapture *L_capture = cvCaptureFromCAM(0);
CvCapture *R_capture = cvCaptureFromCAM(1);
.
.
.
.
while (1)
{
    Img_L = cvQueryFrame(L_capture);
    Img_R = cvQueryFrame(R_capture);
    .
    .
    .
    InvertColor(ROI_L, Inv_L);
    InvertColor(ROI_R, Inv_R);
    .
    .
    .
    if (cvWaitKey(1) == 27)
        break;
}
.
.
.
}

void InvertColor(const IplImage* srcImg, IplImage* dstImg)
{
int src_width = srcImg->width;
int src_height = srcImg->height;

IplImage* pTempImg = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_8U, 1);

for (int j = 0; j < src_height; j++)
{
    for (int i = 0; i < src_width; i++)
    {
        pTempImg->imageData[j * src_width + i + 1] = 255 - srcImg->imageData[j * src_width + i + 1];
    }
}

for (int j = 0; j < src_height; j++)
{
    for (int i = 0; i < src_width; i++)
    {
        dstImg->imageData[j * src_width + i + 1] = pTempImg->imageData[j * src_width + i + 1];
    }
}

cvReleaseImage(&pTempImg);
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)