Xin chào cộng đồng stackoverflow! Tôi đang sử dụng MacBook Pro OS X 10.8.5. Tôi đã tải xuống một opencv tích hợp từ nguồn và thử nghiệm nó bằng một ví dụ đơn giản. Có vẻ như nó đang hoạt động tốt. Tôi cố gắng không sử dụng IDE. Thay vào đó, tôi chỉ viết mã vào trình soạn thảo văn bản và biên dịch nó từ thiết bị đầu cuối. Tôi sử dụng g++ Follow_Ball.cpp -o Follow_Ball pkg-config --cflags --libs opencv
Khi tôi làm điều này, tôi không gặp bất kỳ lỗi nào, nhưng khi tôi cố chạy tệp thực thi "./Follow_Ball" thì nó lại báo lỗi sau.
Lỗi OpenCV: Xác nhận không thành công (src1.size == dst.size && dst.type() == CV_8U) trong cvInRangeS, tệp /opt/local/var/macports/build/_opt_mports_dports_graphics_opencv/opencv/work/opencv-2.4.7 /modules/core/src/arithm.cpp, trang 2972 Dòng libc++abi.dylib: chấm dứt cuộc gọi ném bẫy hủy bỏ ngoại lệ: 6
Thông tin bổ sung có thể liên quan... Tôi đang cố gắng sử dụng webcam tích hợp trong MacBook Pro của mình http://www.apple.com/macbook-pro/Tôi đặt "CvSize size640x480 = cvSize(640,480);" Tôi không chắc đó có phải là pixel của máy tính của mình không. Có lẽ điều này có thể gây ra vấn đề? Tôi cũng đã nhận xét về dòng 117 vì tôi không thể làm cho nó hoạt động được và tôi không nghĩ mình cần nó vì tôi chỉ vẽ một đường màu đỏ xung quanh quả bóng. Tôi hơi bối rối về cách gỡ lỗi này.
Có ai có thể giúp tôi được không? Tôi mới sử dụng opencv và không có nhiều kiến thức hoặc kinh nghiệm về cách gỡ lỗi. Cảm ơn!
("Nhân tiện, tôi đang tham gia một buổi hướng dẫn http://www.lirtex.com/robotics/fast-object-tracking-robot-computer-vision/ ")Đây là mã...
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char* argv[]){
//Kích thước chụp mặc định - 640x480
CvSize size640x480 = cvSize(640,480);
// Mở thiết bị chụp 0 là /dev/video0, 1 là /dev/video1, v.v.
// Luồng video trên web cam được xác nhận cho điều này
CvCapture *p_capWebCam;
// con trỏ tới cấu trúc hình ảnh.
// đây sẽ là hình ảnh được nhập từ webcam
IplImage *p_imgOriginal;
//Con trỏ tới cấu trúc hình ảnh
// đây sẽ là hình ảnh đen trắng đã được xử lý
/* Ipl là viết tắt của thư viện xử lý ảnh Intel. Đây là tiêu chuẩn.
cấu trúc trong opencv để làm việc với hình ảnh */
IplImage *p_imgĐã xử lý;
//Biến lưu trữ cần thiết để truyền vào cvHoughCircles()
CvMemStorage *p_strStorage;
// con trỏ tới một chuỗi opencv, sẽ được trả về bởi cvHough Circles() và sẽ chứa tất cả các vòng tròn
// gọi cvGetSeqElem(p_seqCircles, i) sẽ trả về mảng 3 phần tử của vòng tròn thứ i (xem biến tiếp theo)
CvSeq *p_seqCircles;
// con trỏ tới phần tử thứ 3 của mảng float
//[0] => x vị trí của đối tượng được phát hiện
//[1] => y vị trí của đối tượng được phát hiện
//[2] => Bán kính của đối tượng được phát hiện
float *p_fltXYRadius; // con trỏ tới mảng 3 phần tử float
int i; // bộ đếm vòng lặp
char charCheckForEscKey // lấy char để thoát
p_capWebCam = cvCaptureFromCAM(0); //Nếu bạn có nhiều webcam, bạn có thể không muốn sử dụng 0
// Tuy nhiên, vì tôi chỉ có một nên tôi truyền tham số 0
//kiểm tra xem webcam có hoạt động không
if(p_capWebCam == NULL){
printf("ERROR: capture is NULL"); // Ví dụ: nếu web cam chưa được cắm, chúng tôi sẽ thoát khỏi chương trình
getchar(); //tạm dừng để người dùng nhìn thấy tin nhắn
return(-1); //thoát khỏi chương trình
}
// khai báo 2 cửa sổ
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE ); // Hình ảnh gốc từ webcam
cvNamedWindow("Đã xử lý", CV_WINDOW_AUTOSIZE); // Hình ảnh đã xử lý mà chúng tôi sẽ sử dụng để phát hiện các vòng tròn
p_imgProcessed = cvCreateImage(size640x480, //tạo hình ảnh cho cửa sổ Đã xử lý
IPL_DEPTH_8U, 1); // 8U là viết tắt của 8 bit không dấu // chúng tôi sử dụng 1 cho thang độ xám nếu dưới đây chúng tôi sử dụng 3
// đây là hình ảnh thang độ xám nên mỗi pixel có thể có thang độ xám từ 0->255
// đây là màu "Red Green Blue" sẽ là một giá trị cho mỗi màu: hãy gọi đây là
// độ sâu
// Vòng lặp while mở rộng trong đó khung được lấy từ cam và xử lý
while(1){ // cho mỗi khung hình...
p_imgOriginal = cvQueryFrame(p_capWebCam); //lấy khung hình từ webcam
//kiểm tra xem việc chụp khung hình có thành công không
if(p_imgOriginal == NULL){ // nếu khung không được chụp thành công
printf("LỖI: khung là NULL \n" );
getchar();
phá vỡ;
}
// 44:46 http://www.youtube.com/watch?v=2i2bt-YSlYQ&list=PLbqNFa0YhiNBHuQOwalaP5jNGExrmsGOO
cvInRangeS(p_imgOriginal, //đầu vào hàm //màu
CV_RGB(175, 0, 0), // đây là macro, chúng tôi muốn chụp một quả bóng màu đỏ bao gồm ít nhất 175
CV_RGB(255, 100, 100), //chúng tôi cho phép một chút màu xanh lá cây và xanh lam: Không bao gồm Redis max 256
p_imgProcessed ); // đầu ra hàm // đen trắng
//cấp phát biến lưu trữ
p_strStorage = cvCreateMemStorage(0); //phân bổ biến lưu trữ cần thiết để truyền int cvHoughCirlces()
//bây giờ chúng tôi áp dụng tính năng làm mịn Agousian cho hình ảnh đã xử lý, điều này sẽ giúp các vòng tròn ảnh tiếp theo dễ dàng hơn.
cvSmooth(p_imgProcessed, //đầu vào hàm
p_imgProcessed, // đầu ra hàm
CV_GAUSSIAN, //Sử dụng bộ lọc Gaussian (tính trung bình các pixel lân cận, với các giá trị đóng có chiều cao cao hơn)
9, // Làm mịn chiều rộng cửa sổ bộ lọc
9); // Làm mịn chiều cao cửa sổ bộ lọc
// bắt chước một hộp 9x9 trong hình ảnh đầu vào, nó sẽ làm mịn đầu ra
// điền vào cấu trúc tuần tự với tất cả các vòng tròn trong hình ảnh đã xử lý
p_seqCircles = cvHoughCircles( p_imgProcessed, //đầu vào: phải có thang độ xám "không màu"
p_strStorage, //Cần cái này chúng ta không cần biết tại sao.
CV_HOUGH_GRADIENT , // Tùy chọn duy nhất cho điều này, thuật toán hai lần vượt qua để phát hiện vòng tròn
2, // kích thước của hình ảnh này/ (giá trị này) = hình ảnh tích lũy
p_imgProcessed->height/4, //khoảng cách tối thiểu tính bằng pixel giữa tâm của các vòng tròn được phát hiện
100, //ngưỡng cao của bộ dò biên Cany, được gọi bởi cvHoughCircles
50, // ngưỡng thấp của bộ dò biên Cany, được gọi bởi cvHoughCircles
10, //Bán kính vòng tròn tối thiểu
400); // bán kính vòng tròn tối đa
for(i = 0; i < p_seqCircles->total; i++){ // cho mỗi phần tử trong cấu trúc vòng tròn tuần tự (tức là cho từng đối tượng được phát hiện)
p_fltXYRadius = (float*)cvGetSeqElem(p_seqCircles, i); //từ cấu trúc tuần tự, đọc giá trị thứ i vào một con trỏ tới một float
printf("vị trí quả bóng x = %f, y = %f, r = %f \n", p_fltXYRadius[0], //x vị trí ở tâm vòng tròn
p_fltXYRadius[1], //vị trí y ở tâm đường tròn
p_fltXYRadius[2]); // bán kính đường tròn
//vẽ một vòng tròn nhỏ màu xanh lá cây ở giữa đối tượng được phát hiện
cvCircle(p_imgOriginal, //vẽ lên ảnh gốc
cvPoint(cvRound(p_fltXYRadius[0]), cvRound(p_fltXYRadius[1])), // tâm của đường tròn
Bán kính 3, // 3 pixel của hình tròn
CV_RGB(0, 255, 0), //vẽ màu xanh thuần khiết
CV_FILLED); // độ dày, điền vào vòng tròn
/* cái này vẽ một vòng tròn quanh quả bóng thứ hai nhưng tôi không cần nó
//vẽ một vòng tròn màu đỏ xung quanh đối tượng được phát hiện
cvCircle(p_imgOriginal, //vẽ lên ảnh gốc
cvPoint(cvRound(p_fltXYRadius[0]), cvRound(p_fltXYRadius[1])), // tâm của đường tròn
cvRound(p_fltXYRadius[2], // bán kính hình tròn tính bằng pixel
CV_RGB(255, 0, 0), //vẽ màu đỏ thuần
3); // độ dày của hình tròn tính bằng pixel
*/
}// kết thúc vòng lặp for
//bây giờ chúng ta chỉ cần hiển thị những hình ảnh mà chúng ta đã tạo
cvShowImage("Original", p_imgOriginal); //vòng tròn gốc với lớp phủ bóng detectec
cvShowImage("Đã xử lý", p_imgProcessed); //hình ảnh sau khi xử lý
cvReleaseMemStorage(&p_strStorage); //giải phóng những gì chúng tôi đã phân bổ trước đó
charCheckForEscKey = cvWaitKey(10); // độ trễ tính bằng ms và nhận phím bấm, nếu có
if( charCheckForEscKey == 27) break; // nếu nhấn ascii 27 thì nhảy ra khỏi vòng lặp while
}//kết thúc một lúc
cvReleaseCapture(&p_capWebCam);
cvDestroyWindow("Bản gốc");
cvDestroyWindow("Đã xử lý");
return(0);
}//kết thúc chương trình
Tôi là một lập trình viên xuất sắc, rất giỏi!