LAMPIRAN CODE PROGRAM PLC Program master (P0) STEP 0 IF saklar THEN LOAD V200 TO TP0 SET T0 RESET P1 RESET P2 STEP 1 IF N T0 THEN SET silA SET silC STEP 2 IF N saklar THEN LOAD V300 TO TP0 SET T0 STEP 3 IF N T0 THEN SET silB
STEP 4 IF N sb_ret THEN LOAD V300 TO TP0 SET T0 STEP 5 IF N T0 THEN RESET silA RESET silB STEP 6
IF saklar1 AND N saklar2 THEN SET P1 JMP TO 0 OTHRW JMP TO 7 STEP 7
IF saklar2 AND N saklar1 THEN
SET P2 JMP TO 0
OTHRW
Program slave 1 STEP 0 IF saklar1 THEN LOAD V400 TO TP0 SET T0 STEP 1 IF N T0 THEN SET silD STEP 2 IF sb_ret THEN LOAD V200 TO TP0 SET T0 STEP 3 IF N T0 THEN RESET silD RESET P1 JMP TO 0 Program slave 2 STEP 0 IF saklar2 THEN
LOAD V400 TO TP0 SET T0 STEP 1 IF N T0 THEN RESET silC STEP 2 IF N sc_ext THEN LOAD V200 TO TP1 SET T0 STEP 3 IF N T0 THEN SET silE STEP 4 IF N se_ret THEN LOAD V100 TO TP1 SET T0 STEP 5
IF N T0 THEN RESET sile STEP 6 IF se_ret THEN LOAD V200 TO TP1 SET T0 STEP 7 IF N T0 THEN SET silC RESET P2 JMP TO 0
LAMPIRAN CODE PROGRAM OPENCV
/* ---library openCV--- */ #include "stdafx.h"
#include <cv.h> #include <cxcore.h> #include <highgui.h>
#define PPORT_BASE ((short) 0x378)
/* ---inisialisasi tipe output kirim data--- */
typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum); oupfuncPtr oup32fp;
/* ---inisialisasi fungsi penulisan data register--- */ void Out32 (short portaddr, short datum)
{
(oup32fp)(portaddr,datum); }
/* ---pengiriman logic ke paralel port--- */ void test_write_datum(short datum)
{
short x; short i;
i=PPORT_BASE; x = datum;
/ ---Write the data register--- */ Out32(i,x);
printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x); }
/* ---fungsi untuk menggambar segitiga pada image--- */ void drawTriangle( IplImage* img, CvSeq* all, char* wndname ) {
CvSeqReader reader;
IplImage* cpy = cvCloneImage( img ); int i;
/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );
/* -membaca 3 sequence element pada satu waktu (semua vertek pada triangle)- */ for( i = 0; i < all->total; i += 3 ) { CvPoint pt[3], *rect = pt; /* ---membaca 3 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader );
if (count == 3) { /* ---kirim logic 1---*/ test_write_datum(0x1); }
/* ---gambar segitiga sebagai banyak garis yang tertutup--- */
cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); }
/* ---menampilkan gambar segitiga--- */ cvShowImage( wndname, cpy );
cvReleaseImage( &cpy ); }
/* ---fungsi untuk menggambar kotak pada image--- */
void drawSquares( IplImage* img, CvSeq* all, char* wndname ) {
CvSeqReader reader;
IplImage* cpy = cvCloneImage( img ); int i;
/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );
/* -membaca 4 sequence element pada satu waktu (semua vertek pada square)- */ for( i = 0; i < all->total; i += 4 ) { int a=0; CvPoint pt[4], *rect = pt; int count = 4; /* ---membaca 4 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); if (count == 4) { /* ---kirim logic 1--- */ test_write_datum(0x01); }
cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); }
/* ---menampilkan gambar segiempat--- */ cvShowImage( wndname, cpy );
cvReleaseImage( &cpy ); }
/* ---fungsi untuk menggambar segilima pada image--- */ void drawPentagon( IplImage* img, CvSeq* all, char* wndname ) {
CvSeqReader reader;
IplImage* cpy = cvCloneImage( img ); int i;
/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );
/* -membaca 5 sequence element pada satu waktu (semua vertek pada pentagon)- */ for( i = 0; i < all->total; i += 5 )
{
int count = 5; /* ---membaca 5 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); CV_READ_SEQ_ELEM( pt[4], reader ); if (count == 5) { /* ---kirim logic 1--- */ test_write_datum(0x01); }
/* ---gambar segilima sebagai banyak garis yang tertutup--- */
cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); }
/* ---menampilkan gambar segilima--- */ cvShowImage( wndname, cpy );
}
/* ---fungsi untuk menggambar segienam pada image--- */ void drawHexagon( IplImage* img, CvSeq* all, char* wndname ) {
CvSeqReader reader;
IplImage* cpy = cvCloneImage( img ); int i;
/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );
/* -membaca 6 sequence element pada satu waktu (semua vertek pada hexagon)- */ for( i = 0; i < all->total; i += 6 ) { CvPoint pt[6], *rect = pt; int count = 6; /* ---membaca 6 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader );
CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); CV_READ_SEQ_ELEM( pt[4], reader ); CV_READ_SEQ_ELEM( pt[5], reader );
/* ---gambar segienam sebagai banyak garis yang tertutup--- */
cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); if (count == 6) { /* ---kirim logic 1--- */ test_write_datum(0x4); } }
/* ---menampilkan gambar segienam--- */ cvShowImage( wndname, cpy );
cvReleaseImage( &cpy ); }
/* ---fungsi untuk menggambar segienam pada image--- */ void drawOctagon( IplImage* img, CvSeq* all, char* wndname )
{
CvSeqReader reader;
IplImage* cpy = cvCloneImage( img ); int i;
/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );
/* -membaca 5 sequence element pada satu waktu (semua vertek pada pentagon)- */ for( i = 0; i < all->total; i += 8 ) { CvPoint pt[8], *rect = pt; int count = 8; /* ---membaca 6 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); CV_READ_SEQ_ELEM( pt[4], reader ); CV_READ_SEQ_ELEM( pt[5], reader ); CV_READ_SEQ_ELEM( pt[6], reader ); CV_READ_SEQ_ELEM( pt[7], reader );
/* ---gambar segienam sebagai banyak garis yang tertutup--- */
cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); if (count == 8) { /* ---kirim logic 1--- */ test_write_datum(0x4); } }
/* ---menampilkan gambar segiempat--- */ cvShowImage( wndname, cpy );
cvReleaseImage( &cpy ); }
/* ---Fungsi utama--- */ int _tmain(int argc, _TCHAR* argv[]) {
/* ---Load the library--- */ HINSTANCE hLib;
if (hLib == NULL) {
fprintf(stderr,"LoadLibrary Failed.\n"); return -1;
}
/* ---men-cek alamat fungsi--- */
oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if (oup32fp == NULL) {
fprintf(stderr,"GetProcAddress for Oup32 Failed.\n"); return -1;
}
/* ---inisialisasi variabel--- */ double pilih;
int delay=1000, a=0;
IplImage *fileName;
/* ---Tampilan awal--- */
printf("\n\nMenu Pilihan Benda : \n"); printf ("1. deteksi lingkaran\n"); printf ("2. deteksi segitiga\n"); printf ("3. deteksi segiempat\n"); printf ("4. deteksi segilima\n"); printf ("5. deteksi segienam\n"); printf ("6. deteksi segidelapan\n\n");
do {
int pilih = 1;
if (pilih>0 && pilih<2) {
do {
printf("\n\n\n\n\n\n\n\n\n\n\n\n Detect Circle \n\n\n");
/* ---mengambil citra dari tempat penyimpanan pheephole--- */ IplImage *im2 = cvLoadImage("D:/SKRIPSI/PH3.jpg",1);
IplImage *im1 = cvLoadImage("D:/SKRIPSI/PH3.jpg",0);
cvNamedWindow("image processing", 1); cvShowImage("image processing", im2);
/* ---threshold--- */
cvThreshold( im1, im1, 119, 150, CV_THRESH_BINARY ); cvNamedWindow("Tres:");
/* ---menampilkan gambar hasil threshold--- */ cvShowImage("Tres:", im1);
printf("Tres Image ON\n");
/* ---edge detection dengan canny--- */
cvCanny(im1, im1, 145, 150, 3); //harus dari grayscale
/* ---menampilkan gambar hasil canny--- */ cvNamedWindow("Canny",1);
cvShowImage("Canny",im1);
printf("Canny Edge Detection ON\n");
/* -menyimpan gambar hasil dari proses canny ke dalam register-*/ cvSaveImage("saved.jpg",im1);
/* ---inisialisasi variabel type array--- */ IplImage *gray, *view;
CvMemStorage* storage;
CvSeq* circles;
printf("\n Detecting Circles");
storage = cvCreateMemStorage(0); view = cvCloneImage(img);
/* --mengubah besar image dari ukuran tertentu menjadi 8 bit-- */ gray = cvCreateImage( cvGetSize(img), 8, 1 );
cvCvtColor( img, gray, CV_BGR2GRAY );
/* ---smoothing dengan Gaussian--- */
cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smoothing ini dilakukan untuk mengurangi kesalahan deteksi lingkaran
/* ---mendeteksi lingkaran dengan Hough Gradient--- */
circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );
for( int i = 0; i < circles->total; i++ ) {
int count=1;
float* p = (float*)cvGetSeqElem( circles, i );
/* ---menggambar lingkaran yang ditemukan pada image--- */
cvCircle( view, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( view, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
/* --kirim logic 1 ke rangkaian relay melalui parallel port-- */ test_write_datum(0x01);
}
/* ---tampilkan gambar hasil detect lingkaran--- */ cvNamedWindow( "detected", 1 );
cvShowImage( "detected", view );
/* ---delay 1 detik--- */ cvWaitKey(delay);
/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img); cvDestroyAllWindows(); }while(delay==3000); } pilih=2; if (pilih<3&&pilih>1) { do {
printf("\n\n\n\n\n\n\n\n\n\n\n\n Detect Vertek \n\n\n");
/* ---mengambil citra dari tempat penyimpanan pheephole--- */ IplImage *im2 = cvLoadImage("D:/SKRIPSI/PH3.jpg",1);
IplImage *im1 = cvLoadImage("D:/SKRIPSI/PH3.jpg",0);
/* ---menampilkan gambar original--- */ cvNamedWindow("image processing", 1);
/* ---threshold--- */
cvThreshold( im1, im1, 119, 150, CV_THRESH_BINARY );
/* ---menampilkan gambar hasil threshold--- */ cvNamedWindow("Tres:");
cvShowImage("Tres:", im1); printf("Tres Image ON\n");
/* ---edge detection dengan canny--- */
cvCanny(im1, im1, 145, 150, 3); //harus dari grayscale
/* ---menampilkan gambar hasil canny--- */ cvNamedWindow("Canny",1);
cvShowImage("Canny",im1); printf("Canny Edge Detection ON\n");
/* ---menyimpan gambar hasil dari proses canny ke dalam register--- */
cvSaveImage("saved.jpg",im1);
IplImage *img = cvLoadImage("saved.jpg");
/* ---inisialisasi variabel type array--- */ IplImage *gray, *view;
CvMemStorage* storage;
CvSeq* circles;
/* ---inisialisasi variabel--- */
CvSeq* contours;
int i, c, l, N = 11;
/* ---mencari besarnya image original--- */ CvSize sz = cvSize( img->width, img->height);
IplImage* timg = cvCloneImage( img ); // make a copy of input image IplImage* gray = cvCreateImage( sz, 8, 1 );
/* ---menciptakan image dengan ukuran yang baru (1/2 ukuran image lama)--- */
IplImage* pyr = cvCreateImage( cvSize(sz.width/2, sz.height/2), 8, 3 );
/* ---deklarasi variabel--- */
IplImage* tgray;
CvSeq* result;
double s, t;
CvSeq* all = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage );
/* ---memilih ROI pada image dengan lebar dan panjangnya dibagi 2--- */
cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height ));
/* ---filter untuk mengurangi noise dengan down-scale dan upscale--- */
cvPyrDown( timg, pyr, 7 ); cvPyrUp( pyr, timg, 7 );
tgray = cvCreateImage( sz, 8, 1 );
/* ---menemukan contours dengan metode chain code dan menyimpan semuanya ke dalam sebuah list--- */
cvFindContours( gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
/* ---test setiap contour--- */ while( contours )
{
/* ---memberikan ketebalan garis contour 0.02--- */
result = cvApproxPoly( contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0 );
/* ----kontur segitiga harus punya 3 vertek setelah perkiraan yang secara relatif area besar (untuk menyaring noise kontur---/
if( result->total == 3 && fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 && cvCheckContourConvexity(result) )
{
/* ---menyimpan vertek yang ditemukan ke result--- */ cvSeqPush( all,(CvPoint*)cvGetSeqElem( result, i )); }
/* ---cek countour berikutnya--- */ contours = contours->h_next; } }while(delay==3000); } int count pilih=3; if (pilih<4&&pilih>2) { if (count = 3)
{
printf("\n Detecting Triangle\n"); storage = cvCreateMemStorage(0);
view = cvCloneImage(img);
cvNamedWindow( "detectedT", 1 );
/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */
drawTriangle( view, img, storage, "detectedT" );
/* ---delay 1 detik--- */ cvWaitKey(delay);
/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);
cvDestroyAllWindows(); }
if (count = 4) {
storage = cvCreateMemStorage(0); view = cvCloneImage(img);
cvNamedWindow( "detectedS", 1 );
/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */
drawTriangle( view, img, storage, "detectedS" );
/* ---delay 1 detik--- */ cvWaitKey(delay);
/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);
cvDestroyAllWindows(); }
if (count = 5) {
printf("\n Detecting Pentagon \n"); storage = cvCreateMemStorage(0);
view = cvCloneImage(img);
cvNamedWindow( "detectedP", 1 );
/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */
drawTriangle( view, img, storage, "detectedP" );
/* ---delay 1 detik--- */ cvWaitKey(delay);
/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);
cvDestroyAllWindows(); }
if (count = 6) {
printf("\n Detecting Hexagon \n"); storage = cvCreateMemStorage(0);
view = cvCloneImage(img);
/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */
drawTriangle( view, img, storage, "detectedH" );
/* ---delay 1 detik--- */ cvWaitKey(delay);
/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);
cvDestroyAllWindows(); }
if (count = 8) {
printf("\n Detecting Octagon \n"); storage = cvCreateMemStorage(0);
view = cvCloneImage(img);
cvNamedWindow( "detectedO", 1 );
/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */
drawTriangle( view, img, storage, "detectedO" );
/* ---delay 1 detik--- */ cvWaitKey(delay);
/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img); cvDestroyAllWindows(); } } }while(delay==1000); }