2012-02-09 18 views
7

Các mã sau sẽ gửi thông báo lỗi:opencv - Assertion không thành công (dst.data == dst0.data) trong cvCvtColor

// object is a color image with type cv::Mat 

IplImage* temp_object = &(IplImage)object; 
IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 3); 
assert(temp_object->nChannels == 3 && temp_object->depth == IPL_DEPTH_8U); 
assert(ipl_object->nChannels == 3 && ipl_object->depth == IPL_DEPTH_8U); 
cvCvtColor(ipl_object, temp_object, CV_BGR2GRAY); 

Lỗi

OpenCV Error: Assertion failed (dst.data == dst0.data) in cvCvtColor, file /opt/local /var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.3.1/modules/imgproc/src/color.cpp, line 3175 terminate called throwing an exception`

đang cập nhật sau khi chỉnh sửa (nó sẽ hoạt động ngay bây giờ). Cảm ơn đã giúp đỡ!

IplImage temp_object (object); 
IplImage* ipl_object = cvCreateImage(cvGetSize(&temp_object), 8, 1); 
cvCvtColor(&temp_object, ipl_object, CV_BGR2GRAY); 

Trả lời

7
IplImage* temp_object = &(IplImage)object; 

Điều đó không cung cấp cho bạn một con trỏ đến object, diễn dịch lại như IplImage; thay vào đó, nó tạo ra một tạm thời IplImage từ object, cung cấp cho bạn một con trỏ đến đó và sau đó phá hủy tạm thời, để lại temp_object trỏ đến không có giá trị. Sử dụng temp_object sau đó sẽ cho hành vi không xác định.

Tôi không quen thuộc với thư viện, nhưng có lẽ bạn muốn có một con trỏ đến object (nếu IplImage là một subtype của bất cứ loại object là):

IplImage* temp_object = static_cast<IplImage *>(&object); 

sử dụng một dàn diễn viên để chuyển đổi một con trỏ (hoặc một tham chiếu, nếu bạn thích), không phải là đối tượng.

Hoặc có thể bạn muốn có một (không tạm thời) đối tượng mới:

IplImage temp_object(object); 
+0

Cảm ơn bạn đã giải thích. 'IplImage * temp_object = static_cast (& đối tượng);' sẽ đưa ra 'lỗi: static_cast không hợp lệ từ loại 'cv :: Mat *' để nhập 'IplImage *'' – LKS

+0

@ user1020390: Trong trường hợp đó, có lẽ bạn muốn thực hiện một đối tượng mới; bạn cần phải đặt tên cho nó để nó không phải là tạm thời. Xem chỉnh sửa của tôi. –

+0

Cảm ơn. Tôi nghĩ rằng nó sẽ hoạt động ngay bây giờ. – LKS

4

vấn đề khác là CV_BGR2GRAY hy vọng đích để trở thành một kênh duy nhất, chứ không phải tăng gấp ba lần. Ngoài ra, chữ ký của cvCvtColor() bắt đầu bằng SRC và sau đó là DST. Bạn có thể muốn điều chỉnh mã của mình thành một cái gì đó như:

IplImage* ipl_object = cvCreateImage(cvGetSize(temp_object), 8, 1); 
cvCvtColor(&object, ipl_object, CV_BGR2GRAY); 
+0

Cảm ơn! Tôi đã phạm sai lầm trong cvCvtColor. Lời khuyên của bạn là đúng. Đó là những gì tôi định làm. Như tôi cũng đã nhận xét ở trên, tôi không thể tạo temp_object với kiểu thích hợp với dòng 'IplImage * temp_object = static_cast (& object); '. Lỗi cho biết đó là static_cast không hợp lệ. Tôi có nhầm lẫn ở đâu đó không? – LKS

+1

Cảm ơn. Tôi nghĩ rằng nó sẽ hoạt động ngay bây giờ. – LKS

Các vấn đề liên quan