Lua API: framediff#
คำอธิบาย#
โครงสร้างข้อมูล framediff เก็บข้อมูลเกี่ยวกับความแตกต่างระหว่างสองเฟรมที่แตกต่างกันที่ถ่ายด้วย CMUcam3 ภายในนั้นเฟรมเหล่านี้ถูกเก็บไว้ในเทมเพลต "current" และ "previous" การเปรียบเทียบระหว่างสองเทมเพลตนั้นทำโดยใช้ framediff_scanline_start, framediff_scanline และ framediff_scanline_finish
ตัวอย่าง#
ตัวอย่างนี้สาธิตการใช้งานโดยใช้ CMUcam3 และการทำ frame differencing มันวนซ้ำ ถ่ายภาพจนกระทั่งภาพหนึ่งแตกต่างจากภาพก่อนหน้า ณ จุดนั้นมันจะบันทึกภาพนั้นลงดิสก์โดยเรียก save_picture
-- get a new framediff, and initialize it
fdiff = framediff_new(16, 16);
fdiff:set_total_x(pixbuf_get_width());
fdiff:set_total_y(pixbuf_get_height());
fdiff:set_threshold(10);
img = image_new(pixbuf_get_width(), 1); -- need an image object for the framediff'ing
take_picture();
fdiff:set_load_frame(true);
-- take the first picture
if (framediff_scanline_start(fdiff) > 0) then
while pixbuf_read_rows(img, 1) > 0 do
framediff_scanline(img, fdiff);
end
framediff_scanline_finish(fdiff);
end
fdiff:set_load_frame(false);
-- now keep taking pictures until a picture is different than its predecessor
repeat
take_picture();
if (framediff_scanline_start(fdiff) > 0) then
while pixbuf_read_rows(img, 1) > 0 do
framediff_scanline(img, fdiff);
end
framediff_scanline_finish(fdiff);
else
print("Error!");
end
fdiff:swap_templates(); -- put current template in previous template spot
until fdiff:get_num_pixels() > fdiff:get_threshold()
-- we got an image that was different! Save it to disk, and send it to the Camscripter
save_picture("Diff.ppm"):
print_picture();
ตัวสร้าง#
ดู framediff_new ใน Lua API: ฟังก์ชัน
เมธอด#
disposeget_coiget_load_frameget_num_pixelsget_template_heightget_template_widthget_thresholdget_total_xget_total_yset_coiset_load_frameset_total_xset_total_yset_thresholdswap_templates
dispose#
fdiff:dispose()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
ไม่มี
ให้วิธีการกำจัดหน่วยความจำที่เกี่ยวข้องกับโครงสร้างข้อมูล framediff นี้อย่างชัดเจน แทนที่จะรอให้ตัวเก็บขยะของ Lua กำจัดหน่วยความจำนั้น คำเตือน: ข้อผิดพลาดมีแนวโน้มที่จะเกิดจากการใช้ framediff หลังจากเรียก dispose บนมันแล้ว ขอแนะนำอย่างยิ่งว่าคุณไม่ควรทำเช่นนั้น
get_coi#
fdiff:get_coi()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
แชนเนลที่สนใจสำหรับโครงสร้าง framediff นี้
รับช่องที่สนใจสำหรับโครงสร้างนี้ ดูค่าคงที่ของช่องที่สนใจใน Lua API: ค่าคงที่ สำหรับค่าที่อาจส่งคืนได้
get_load_frame#
fdiff:get_load_frame()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
ว่าเราต้องการโหลดเฟรมใหม่หรือไม่
รับค่าของ load_frame สำหรับออบเจกต์ framediff นี้ load_frame กำหนดว่าเราต้องโหลดเฟรมใหม่จาก CMUcam3 หรือไม่ก่อนที่จะหาความแตกต่างของเทมเพลตปัจจุบันและก่อนหน้า
get_num_pixels#
fdiff:get_num_pixels()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
จำนวนพิกเซลของความแตกต่างระหว่างเทมเพลตปัจจุบันและเทมเพลตก่อนหน้า
หลังจากใช้ framediff_scanline_start, framediff_scanline และ framediff_scanline_finish แล้ว ให้เรียกเมธอดนี้เพื่อรับจำนวนพิกเซลของความแตกต่างที่พบระหว่างเทมเพลตปัจจุบันกับเทมเพลตก่อนหน้า
get_template_height#
fdiff:get_template_height()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
ความสูงของเทมเพลต
รับความสูงของเทมเพลตที่กำลังหาความแตกต่าง
get_template_width#
fdiff:get_template_width()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
ความกว้างของเทมเพลต
รับความกว้างของเทมเพลตที่กำลังหาความแตกต่าง
get_total_x#
fdiff:get_total_x()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
ความกว้างทั้งหมดที่จะวิเคราะห์
รับความกว้างทั้งหมด ซึ่งมักเทียบเท่ากับ pixbuf_get_width
get_total_y#
fdiff:get_total_y()
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
ความสูงทั้งหมดที่จะวิเคราะห์
รับความกว้างทั้งหมด ซึ่งมักเทียบเท่ากับ pixbuf_get_height
set_coi#
fdiff:set_coi(integer channel_of_interest)
- พารามิเตอร์:
channel_of_interestแชนเนลที่สนใจใหม่สำหรับการทำ frame differencing- ค่าที่ส่งคืน:
ไม่มี
ตั้งค่าแชนเนลที่สนใจสำหรับการทำ framedifferencing พารามิเตอร์ channel_of_interest ต้องเป็นหนึ่งในค่าคงที่แชนเนลที่สนใจใน Lua API: ค่าคงที่
set_load_frame#
fdiff:set_load_frame(boolean newValue)
- พารามิเตอร์:
newValueค่าใหม่- ค่าที่ส่งคืน:
ไม่มี
ควบคุมว่าจำเป็นต้องโหลดเฟรมใหม่ในระหว่างรอบถัดไปของการหาความแตกต่างของเฟรมหรือไม่ หากค่านี้เป็นจริง จะมีการถ่ายภาพใหม่และเก็บไว้เป็นเทมเพลตปัจจุบันสำหรับวัตถุประสงค์การหาความแตกต่างของเฟรม
set_total_x#
fdiff:set_total_x(integer total_x)
- พารามิเตอร์:
total_xค่าใหม่สำหรับ total_x- ค่าที่ส่งคืน:
ไม่มี
ตั้งค่า total_x สำหรับแพ็กเก็ต framediff
set_total_y#
fdiff:set_total_y(integer total_y)
- พารามิเตอร์:
total_yค่าใหม่สำหรับ total_y- ค่าที่ส่งคืน:
ไม่มี
ตั้งค่า total_y สำหรับแพ็กเก็ต framediff
set_threshold#
fdiff:set_threshold(integer threshold)
- พารามิเตอร์:
thresholdค่าเทรชโฮลด์ใหม่- ค่าที่ส่งคืน:
ไม่มี
ตั้งค่าเทรชโฮลด์ เป็นจำนวนพิกเซลที่แตกต่างกัน ที่กำหนดว่าเฟรมหนึ่งถือว่า "แตกต่าง" จากอีกเฟรมหนึ่งหรือไม่
swap_templates#
fdiff:swap_templates
- พารามิเตอร์:
ไม่มี
- ค่าที่ส่งคืน:
ไม่มี
สลับเทมเพลตปัจจุบันและก่อนหน้าในโครงสร้าง framediff นี้ ฟังก์ชันนี้นำ current_template ไปใส่ใน previous_template และในทางกลับกัน