2011-09-08 3 views
1

웹캠의 라이브 비디오에서 opencv의 가장자리 감지 기능을 구현하려고합니다. 그러나이 오류가 발생합니다 :라이브 비디오의 OpenCV Canny Edge

OpenCV 오류 : 알 수없는 함수, 파일 ........ \ ocv \ opencv \ src \ cv \ cvcanny.cpp 줄에 <>없는 형식 또는 형식 조합 66

이것이 형식 문제라고 생각합니다. 3 채널 8 비트 RGB 이미지를 1 채널 회색조 이미지 프레임으로 변환 한 다음 결과에서 가장자리 감지를 수행 할 수 있습니다. 그러나 이미지에 rgb2grayscale 변환도 구현할 수 없습니다. <이 전환 코드의 채널 수가 잘못되었습니다.>

아래 코드는 VS2008에서 구현 한 코드입니다. 이 오류를 해결하는 방법에 대한 의견이 있으십니까?

IplImage* gray_out = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 
IplImage* canny_out = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 

과에서 사용 :

#pragma once 

#include <stdio.h> 
#include <tchar.h> 
#include <iostream> 
#include <conio.h> 
#include <iomanip> 
#include <cv.h> 
#include <cvaux.h> 
#include <cxcore.h> 
#include <highgui.h> 
#include <math.h> 
#include <string.h> 
#include <cxtypes.h> 


using namespace std; 
using namespace cv; 

int main(int, char**) 
{ 

    cvNamedWindow("Edges", CV_WINDOW_AUTOSIZE); 
CvCapture* capture = cvCaptureFromCAM(0); 

IplImage* frame; 
    while(1) { 
     frame = cvQueryFrame(capture); 


     int depth_img =frame->depth; 
     int height_img =frame->height; 
     int width_img =frame->width; 
     int size_img =frame->imageSize; 
     int nchan_img =frame->nChannels; 
     int nsize_img =frame->nSize; 

     cout << setw(15) << "depth" << depth_img << endl; 
     cout << setw(15) << "height" << height_img << endl; 
     cout << setw(15) << "width" << width_img << endl; 
     cout << setw(15) << "size" << size_img << endl; 
     cout << setw(15) << "nchan" << nchan_img << endl; 
     cout << setw(15) << "nsize" << nsize_img << endl; 


     IplImage* out = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); 
     cvSmooth(frame, out, CV_GAUSSIAN, 11, 11); 
     cvCvtColor(out ,out, CV_RGB2GRAY); 
     cvCanny(out, out, 10, 10, 3); 

     if(!frame) break; 
     cvShowImage("Edge", out); 
     char c = cvWaitKey(33); 
     if(c == 27) break; 
    } 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("Edge"); 
    return 0; 
} 

답변

3

문제는 당신이 everywere

IplImage* out = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); 

는 단일 채널의 다른 두 개의 이미지를 만들고 사람들을 사용하는 3 채널 이미지를 전달하는 것입니다

cvSmooth(frame, out, CV_GAUSSIAN, 11, 11); 
cvCvtColor(out , gray_out, CV_RGB2GRAY); 
cvCanny(gray_out, canny_out, 10, 10, 3); 

if(!frame) break; 
cvShowImage("Edge", canny_out); 

티 님의 작품 :

#include <stdio.h> 
#include <iostream> 
#include <iomanip> 
#include <cv.h> 
#include <cvaux.h> 
#include <cxcore.h> 
#include <highgui.h> 
#include <math.h> 
#include <string.h> 


using namespace std; 
using namespace cv; 

int main(int, char**) 
{ 

    cvNamedWindow("Edges", CV_WINDOW_AUTOSIZE); 
CvCapture* capture = cvCaptureFromCAM(0); 

IplImage* frame; 
    while(1) { 
     frame = cvQueryFrame(capture); 

     int depth_img =frame->depth; 
     int height_img =frame->height; 
     int width_img =frame->width; 
     int size_img =frame->imageSize; 
     int nchan_img =frame->nChannels; 
     int nsize_img =frame->nSize; 

     cout << setw(15) << "depth" << depth_img << endl; 
     cout << setw(15) << "height" << height_img << endl; 
     cout << setw(15) << "width" << width_img << endl; 
     cout << setw(15) << "size" << size_img << endl; 
     cout << setw(15) << "nchan" << nchan_img << endl; 
     cout << setw(15) << "nsize" << nsize_img << endl; 


     IplImage* out = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); 
     IplImage* gray_out = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 
     IplImage* canny_out = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 
     cvSmooth(frame, out, CV_GAUSSIAN, 11, 11); 
     cvCvtColor(out , gray_out, CV_RGB2GRAY); 
     cvCanny(gray_out, canny_out, 10, 10, 3); 

     if(!frame) break; 
     cvShowImage("Edge", canny_out); 
     char c = cvWaitKey(33); 
     if(c == 27) break; 
    } 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("Edge"); 
    return 0; 
} 
2

OpenCV 2.x를 사용하고 있습니까? 여기에 또한 작동 코드는하지만, 몇 가지 전에 :

  1. 을 OpenCV가 BGR 함께 작동 기억, 그래서 당신은 변환 할 때, 서로 다른 있어야
  2. 는 검소한에서 임계 값에주의 CV_BGR2GRAY를 사용하고 2 또는 3의 비율로 (권장). 100-200을 시도 할 수도 있습니다 ...
  3. 모든 루프에 인쇄하지 마십시오. 약간의 코드 속도가 느려집니다.
  4. 필터의 경우 큰 창을 사용하지 마십시오. 크기는 보통 3 0r 5입니다 (응용 프로그램에 따라 다름). 크기 11은 아마도 필요하지 않습니다.

좋아, 코드 : 그런데

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

using namespace std; 
using namespace cv; 

int main(int, char**) 
{ 
    namedWindow("Edges", CV_WINDOW_NORMAL); 
    CvCapture* capture = cvCaptureFromCAM(-1); 

    cv::Mat frame; cv::Mat out; cv::Mat out2; 

    while(1) { 
     frame = cvQueryFrame(capture); 

     GaussianBlur(frame, out, Size(5, 5), 0, 0); 
     cvtColor(out ,out2, CV_BGR2GRAY); // produces out2, a one-channel image (CV_8UC1) 
     Canny(out2, out2, 100, 200, 3); // the result goes to out2 again,but since it is still one channel it is fine 

     if(!frame.data) break; 
     imshow("Edges", out2); 

     char c = cvWaitKey(33); 
     if(c == 'c') break; 
    } 
    return 0; 
} 

, 당신은 이력서를 사용하는 것이 좋습니다 :: 매트. 그것은 IplImage보다 훨씬 유연합니다. (더 이상 출시 이미지가 아닙니다.)

0
#include <opencv2/opencv.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 



int main() 
{ 
    Mat img; 
    VideoCapture cap(0); 

    while (true) 
    { 
     cap >> img; 

     Mat edges; 
     cvtColor(img, edges, CV_BGR2GRAY); 

     Canny(edges, edges, 30, 60); 

     imshow("window label", edges); 
     waitKey(1); 
    } 

    return 0; 
} 

이것은 내가 canny 기능을 사용하는 방법입니다.

관련 문제